Support custom working-range logic.

This commit is contained in:
Huy Nguyen
2014-11-25 12:28:15 +02:00
parent 8e2a207373
commit 230520fe7e
4 changed files with 46 additions and 10 deletions

View File

@@ -34,6 +34,13 @@
*/ */
@property (nonatomic, assign) ASRangeTuningParameters rangeTuningParameters; @property (nonatomic, assign) ASRangeTuningParameters rangeTuningParameters;
/**
* @abstract An optional block which can perform custom calculation for working range.
*
* @discussion Can be used to provide custom working range logic for custom layouts.
*/
@property (nonatomic, assign) asrangecontroller_working_range_calculation_block_t workingRangeCalculationBlock;
/** /**
* Reload everything from scratch, destroying the working range and all cached nodes. * Reload everything from scratch, destroying the working range and all cached nodes.
* *

View File

@@ -165,6 +165,16 @@ static BOOL _isInterceptedSelector(SEL sel)
_rangeController.tuningParameters = tuningParameters; _rangeController.tuningParameters = tuningParameters;
} }
- (asrangecontroller_working_range_calculation_block_t)workingRangeCalculationBlock
{
return _rangeController.workingRangeCalculationBlock;
}
- (void)setWorkingRangeCalculationBlock:(asrangecontroller_working_range_calculation_block_t)workingRangeCalculationBlock
{
_rangeController.workingRangeCalculationBlock = workingRangeCalculationBlock;
}
- (void)appendNodesWithIndexPaths:(NSArray *)indexPaths - (void)appendNodesWithIndexPaths:(NSArray *)indexPaths
{ {
[_rangeController appendNodesWithIndexPaths:indexPaths]; [_rangeController appendNodesWithIndexPaths:indexPaths];

View File

@@ -16,6 +16,13 @@ typedef struct {
CGFloat leadingBufferScreenfuls; CGFloat leadingBufferScreenfuls;
} ASRangeTuningParameters; } ASRangeTuningParameters;
typedef NS_ENUM(NSInteger, ASScrollDirection) {
ASScrollDirectionBackward,
ASScrollDirectionForward,
};
typedef NSRange (^asrangecontroller_working_range_calculation_block_t)(ASRangeTuningParameters params, ASScrollDirection scrollDirection, NSRange visibleRange, NSArray *nodeSizes, CGSize viewport);
@protocol ASRangeControllerDelegate; @protocol ASRangeControllerDelegate;
@@ -99,6 +106,13 @@ typedef struct {
*/ */
@property (nonatomic, assign) ASRangeTuningParameters tuningParameters; @property (nonatomic, assign) ASRangeTuningParameters tuningParameters;
/**
* @abstract An optional block which can perform custom calculation for working range.
*
* @discussion Can be used to provide custom working range logic for custom layouts.
*/
@property (nonatomic, readwrite, copy) asrangecontroller_working_range_calculation_block_t workingRangeCalculationBlock;
@end @end

View File

@@ -13,11 +13,6 @@
#import "ASDisplayNodeInternal.h" #import "ASDisplayNodeInternal.h"
#import "ASRangeControllerInternal.h" #import "ASRangeControllerInternal.h"
typedef NS_ENUM(NSInteger, ASScrollDirection) {
ASScrollDirectionBackward,
ASScrollDirectionForward,
};
@interface ASRangeController () { @interface ASRangeController () {
// index path -> node mapping // index path -> node mapping
NSMutableDictionary *_nodes; NSMutableDictionary *_nodes;
@@ -472,11 +467,21 @@ static NSRange ASCalculateWorkingRange(ASRangeTuningParameters params, ASScrollD
- (void)recalculateWorkingRange - (void)recalculateWorkingRange
{ {
NSRange workingRange = ASCalculateWorkingRange(_tuningParameters, NSRange workingRange;
_scrollDirection, if (self.workingRangeCalculationBlock != NULL) {
_visibleRange, workingRange = self.workingRangeCalculationBlock(_tuningParameters,
_nodeSizes, _scrollDirection,
[_delegate rangeControllerViewportSize:self]); _visibleRange,
_nodeSizes,
[_delegate rangeControllerViewportSize:self]);
} else {
workingRange = ASCalculateWorkingRange(_tuningParameters,
_scrollDirection,
_visibleRange,
_nodeSizes,
[_delegate rangeControllerViewportSize:self]);
}
[self setWorkingRange:workingRange]; [self setWorkingRange:workingRange];
} }