[ASDisplayNode] Fix flickering for nodes that support range managed interface state (#2710)

* Fix flickering for range managed nodes

* Go back to old behavior to check for range managed before calling didExitPreloadState in interface state change
This commit is contained in:
Michael Schneider 2016-12-05 10:34:03 -08:00 committed by Hannah Troisi
parent e361d00a73
commit a2e75152f8
2 changed files with 6 additions and 3 deletions

View File

@ -2993,14 +2993,12 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock)
- (void)didExitPreloadState
{
if (_methodOverrides & ASDisplayNodeMethodOverrideClearFetchedData) {
if ([self supportsRangeManagedInterfaceState]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[self clearFetchedData];
#pragma clang diagnostic pop
}
}
}
/**
* We currently only set interface state on nodes in table/collection views. For other nodes, if they are
@ -3068,9 +3066,13 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock)
if (nowPreload) {
[self didEnterPreloadState];
} else {
// We don't want to call -didExitPreloadState on nodes that aren't being managed by a range controller.
// Otherwise we get flashing behavior from normal UIKit manipulations like navigation controller push / pop.
if ([self supportsRangeManagedInterfaceState]) {
[self didExitPreloadState];
}
}
}
// Entered or exited contents rendering state.
BOOL nowDisplay = ASInterfaceStateIncludesDisplay(newState);

View File

@ -1936,6 +1936,7 @@ static bool stringContainsPointer(NSString *description, id p) {
- (void)testDidExitPreloadIsCalledWhenNodesExitPreloadRange
{
ASTestDisplayNode *node = [[ASTestDisplayNode alloc] init];
[node setHierarchyState:ASHierarchyStateRangeManaged];
[node recursivelySetInterfaceState:ASInterfaceStatePreload];
[node recursivelySetInterfaceState:ASInterfaceStateDisplay];