Add API to update the current range mode of a table or collection view range controller

This commit is contained in:
Michael Schneider 2016-02-26 20:20:13 -08:00
parent ab920aa360
commit 60889f555e
7 changed files with 42 additions and 5 deletions

View File

@ -9,6 +9,7 @@
#import <AsyncDisplayKit/ASCollectionView.h>
@protocol ASCollectionViewLayoutFacilitatorProtocol;
@protocol ASRangeControllerUpdateRangeProtocol;
NS_ASSUME_NONNULL_BEGIN
@ -16,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN
* ASCollectionNode is a node based class that wraps an ASCollectionView. It can be used
* as a subnode of another node, and provide room for many (great) features and improvements later on.
*/
@interface ASCollectionNode : ASDisplayNode
@interface ASCollectionNode : ASDisplayNode <ASRangeControllerUpdateRangeProtocol>
- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout;
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout;

View File

@ -219,6 +219,11 @@
return [self.view.rangeController setTuningParameters:tuningParameters forRangeMode:rangeMode rangeType:rangeType];
}
- (void)updateCurrentRangeWithMode:(ASLayoutRangeMode)rangeMode;
{
[self.view.rangeController updateCurrentRangeWithMode:rangeMode];
}
- (void)reloadDataWithCompletion:(void (^)())completion
{
[self.view reloadDataWithCompletion:completion];

View File

@ -8,11 +8,13 @@
#import <AsyncDisplayKit/ASTableView.h>
@protocol ASRangeControllerUpdateRangeProtocol;
/**
* ASTableNode is a node based class that wraps an ASTableView. It can be used
* as a subnode of another node, and provide room for many (great) features and improvements later on.
*/
@interface ASTableNode : ASDisplayNode
@interface ASTableNode : ASDisplayNode <ASRangeControllerUpdateRangeProtocol>
- (instancetype)init; // UITableViewStylePlain
- (instancetype)initWithStyle:(UITableViewStyle)style;

View File

@ -77,6 +77,11 @@
}
}
- (void)updateCurrentRangeWithMode:(ASLayoutRangeMode)rangeMode
{
[self.view.rangeController updateCurrentRangeWithMode:rangeMode];
}
- (_ASTablePendingState *)pendingState
{
if (!_pendingState && ![self isNodeLoaded]) {

View File

@ -14,6 +14,7 @@
@property (nonatomic, retain, readonly) ASDataController *dataController;
@property (nonatomic, weak, readwrite) ASTableNode *tableNode;
@property (nonatomic, strong, readonly) ASRangeController *rangeController;
/**
* Initializer.

View File

@ -11,6 +11,7 @@
#import <AsyncDisplayKit/ASCellNode.h>
#import <AsyncDisplayKit/ASDataController.h>
#import <AsyncDisplayKit/ASLayoutController.h>
#import <AsyncDisplayKit/ASLayoutRangeType.h>
#define RangeControllerLoggingEnabled 0
@ -44,6 +45,10 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (void)visibleNodeIndexPathsDidChangeWithScrollDirection:(ASScrollDirection)scrollDirection;
/// This is a way for a one way update of range with a given mode.
- (void)updateCurrentRangeWithMode:(ASLayoutRangeMode)rangeMode;
/**
* Add the sized node for `indexPath` as a subview of `contentView`.
*
@ -77,6 +82,15 @@ NS_ASSUME_NONNULL_BEGIN
@end
@protocol ASRangeControllerUpdateRangeProtocol <NSObject>
/**
* Updates the current range mode of the range controller for at least the next range update.
*/
- (void)updateCurrentRangeWithMode:(ASLayoutRangeMode)rangeMode;
@end
/**
* Data source for ASRangeController.
*

View File

@ -67,6 +67,14 @@
- (void)visibleNodeIndexPathsDidChangeWithScrollDirection:(ASScrollDirection)scrollDirection
{
_scrollDirection = scrollDirection;
[self scheduleRangeUpdate];
}
- (void)updateCurrentRangeWithMode:(ASLayoutRangeMode)rangeMode
{
_currentRangeMode = rangeMode;
[self scheduleRangeUpdate];
}
@ -130,8 +138,7 @@
NSMutableOrderedSet<NSIndexPath *> *allIndexPaths = [[NSMutableOrderedSet alloc] initWithSet:visibleIndexPaths];
ASInterfaceState selfInterfaceState = [_dataSource interfaceStateForRangeController:self];
ASLayoutRangeMode rangeMode = [ASRangeController rangeModeForInterfaceState:selfInterfaceState
currentRangeMode:_currentRangeMode];
ASLayoutRangeMode rangeMode = (_currentRangeMode == ASLayoutRangeModeInvalid) ? ASLayoutRangeModeMinimum : _currentRangeMode;
ASRangeTuningParameters parametersFetchData = [_layoutController tuningParametersForRangeMode:rangeMode
rangeType:ASLayoutRangeTypeFetchData];
@ -168,7 +175,9 @@
NSSet<NSIndexPath *> *allCurrentIndexPaths = [[allIndexPaths set] copy];
[allIndexPaths unionSet:_allPreviousIndexPaths];
_allPreviousIndexPaths = allCurrentIndexPaths;
_currentRangeMode = rangeMode;
// Update the current range mode based on interface state
_currentRangeMode = [ASRangeController rangeModeForInterfaceState:selfInterfaceState currentRangeMode:_currentRangeMode];
if (!_rangeIsValid) {
[allIndexPaths addObjectsFromArray:ASIndexPathsForMultidimensionalArray(allNodes)];