diff --git a/Source/Details/ASRangeController.mm b/Source/Details/ASRangeController.mm index 5625fd59e..881489e22 100644 --- a/Source/Details/ASRangeController.mm +++ b/Source/Details/ASRangeController.mm @@ -351,21 +351,22 @@ - (void)_updateVisibleNodeIndexPaths } else { // If selfInterfaceState isn't visible, then visibleIndexPaths represents either what /will/ be immediately visible at the // instant we come onscreen, or what /will/ no longer be visible at the instant we come offscreen. - // So, preload and display all of those things, but don't waste resources preloading others. - // We handle this as a separate case to minimize set operations, including -containsObject:. + // So, preload and display all of those things, but don't waste resources displaying others. // // DO NOT set Visible: even though these elements are in the visible range / "viewport", // our overall container object is itself not yet, or no longer, visible. // The moment it becomes visible, we will run the condition above. - BOOL shouldUpdateInterfaceState = NO; if (ASActivateExperimentalFeature(ASExperimentalFixRangeController)) { - shouldUpdateInterfaceState = [visibleIndexPaths containsObject:indexPath]; - } else { - shouldUpdateInterfaceState = [allCurrentIndexPaths containsObject:indexPath]; - } - - if (shouldUpdateInterfaceState) { + if ([visibleIndexPaths containsObject:indexPath]) { + interfaceState |= ASInterfaceStatePreload; + if (rangeMode != ASLayoutRangeModeLowMemory) { + interfaceState |= ASInterfaceStateDisplay; + } + } else if ([displayIndexPaths containsObject:indexPath]) { + interfaceState |= ASInterfaceStatePreload; + } + } else if ([allCurrentIndexPaths containsObject:indexPath]) { interfaceState |= ASInterfaceStatePreload; if (rangeMode != ASLayoutRangeModeLowMemory) { interfaceState |= ASInterfaceStateDisplay;