Update automatic range mode at the beginning of the update pass to consider new information in a possible next pass

This commit is contained in:
Michael Schneider 2016-02-29 11:34:49 -08:00
parent b2eaf83264
commit 568aa6c2fb

View File

@ -23,6 +23,7 @@
ASScrollDirection _scrollDirection; ASScrollDirection _scrollDirection;
NSSet<NSIndexPath *> *_allPreviousIndexPaths; NSSet<NSIndexPath *> *_allPreviousIndexPaths;
ASLayoutRangeMode _currentRangeMode; ASLayoutRangeMode _currentRangeMode;
BOOL _didUpdateCurrentRange;
BOOL _didRegisterForNotifications; BOOL _didRegisterForNotifications;
CFAbsoluteTime _pendingDisplayNodesTimestamp; CFAbsoluteTime _pendingDisplayNodesTimestamp;
} }
@ -39,6 +40,7 @@
_rangeIsValid = YES; _rangeIsValid = YES;
_currentRangeMode = ASLayoutRangeModeInvalid; _currentRangeMode = ASLayoutRangeModeInvalid;
_didUpdateCurrentRange = NO;
return self; return self;
} }
@ -74,6 +76,7 @@
- (void)updateCurrentRangeWithMode:(ASLayoutRangeMode)rangeMode - (void)updateCurrentRangeWithMode:(ASLayoutRangeMode)rangeMode
{ {
_currentRangeMode = rangeMode; _currentRangeMode = rangeMode;
_didUpdateCurrentRange = YES;
[self scheduleRangeUpdate]; [self scheduleRangeUpdate];
} }
@ -139,8 +142,8 @@
ASInterfaceState selfInterfaceState = [_dataSource interfaceStateForRangeController:self]; ASInterfaceState selfInterfaceState = [_dataSource interfaceStateForRangeController:self];
ASLayoutRangeMode rangeMode = _currentRangeMode; ASLayoutRangeMode rangeMode = _currentRangeMode;
if (rangeMode == ASLayoutRangeModeInvalid) { if (!_didUpdateCurrentRange) {
rangeMode = ASLayoutRangeModeMinimum; rangeMode = [ASRangeController rangeModeForInterfaceState:selfInterfaceState currentRangeMode:_currentRangeMode];
} }
ASRangeTuningParameters parametersFetchData = [_layoutController tuningParametersForRangeMode:rangeMode ASRangeTuningParameters parametersFetchData = [_layoutController tuningParametersForRangeMode:rangeMode
@ -179,8 +182,8 @@
[allIndexPaths unionSet:_allPreviousIndexPaths]; [allIndexPaths unionSet:_allPreviousIndexPaths];
_allPreviousIndexPaths = allCurrentIndexPaths; _allPreviousIndexPaths = allCurrentIndexPaths;
// Update the current range mode based on interface state _currentRangeMode = rangeMode;
_currentRangeMode = [ASRangeController rangeModeForInterfaceState:selfInterfaceState currentRangeMode:_currentRangeMode]; _didUpdateCurrentRange = NO;
if (!_rangeIsValid) { if (!_rangeIsValid) {
[allIndexPaths addObjectsFromArray:ASIndexPathsForMultidimensionalArray(allNodes)]; [allIndexPaths addObjectsFromArray:ASIndexPathsForMultidimensionalArray(allNodes)];