99//
1010
1111#import " ASAbstractLayoutController.h"
12+
1213#import " ASAssert.h"
14+
1315#include < vector>
1416
1517extern ASRangeTuningParameters const ASRangeTuningParametersZero = {};
@@ -19,6 +21,68 @@ extern BOOL ASRangeTuningParametersEqualToRangeTuningParameters(ASRangeTuningPar
1921 return lhs.leadingBufferScreenfuls == rhs.leadingBufferScreenfuls && lhs.trailingBufferScreenfuls == rhs.trailingBufferScreenfuls ;
2022}
2123
24+ extern ASDirectionalScreenfulBuffer ASDirectionalScreenfulBufferHorizontal (ASScrollDirection scrollDirection,
25+ ASRangeTuningParameters rangeTuningParameters)
26+ {
27+ ASDirectionalScreenfulBuffer horizontalBuffer = {0 , 0 };
28+ BOOL movingRight = ASScrollDirectionContainsRight (scrollDirection);
29+
30+ horizontalBuffer.positiveDirection = movingRight ? rangeTuningParameters.leadingBufferScreenfuls
31+ : rangeTuningParameters.trailingBufferScreenfuls ;
32+ horizontalBuffer.negativeDirection = movingRight ? rangeTuningParameters.trailingBufferScreenfuls
33+ : rangeTuningParameters.leadingBufferScreenfuls ;
34+ return horizontalBuffer;
35+ }
36+
37+ extern ASDirectionalScreenfulBuffer ASDirectionalScreenfulBufferVertical (ASScrollDirection scrollDirection,
38+ ASRangeTuningParameters rangeTuningParameters)
39+ {
40+ ASDirectionalScreenfulBuffer verticalBuffer = {0 , 0 };
41+ BOOL movingDown = ASScrollDirectionContainsDown (scrollDirection);
42+
43+ verticalBuffer.positiveDirection = movingDown ? rangeTuningParameters.leadingBufferScreenfuls
44+ : rangeTuningParameters.trailingBufferScreenfuls ;
45+ verticalBuffer.negativeDirection = movingDown ? rangeTuningParameters.trailingBufferScreenfuls
46+ : rangeTuningParameters.leadingBufferScreenfuls ;
47+ return verticalBuffer;
48+ }
49+
50+ extern CGRect CGRectExpandHorizontally (CGRect rect, ASDirectionalScreenfulBuffer buffer)
51+ {
52+ CGFloat negativeDirectionWidth = buffer.negativeDirection * rect.size .width ;
53+ CGFloat positiveDirectionWidth = buffer.positiveDirection * rect.size .width ;
54+ rect.size .width = negativeDirectionWidth + rect.size .width + positiveDirectionWidth;
55+ rect.origin .x -= negativeDirectionWidth;
56+ return rect;
57+ }
58+
59+ extern CGRect CGRectExpandVertically (CGRect rect, ASDirectionalScreenfulBuffer buffer)
60+ {
61+ CGFloat negativeDirectionHeight = buffer.negativeDirection * rect.size .height ;
62+ CGFloat positiveDirectionHeight = buffer.positiveDirection * rect.size .height ;
63+ rect.size .height = negativeDirectionHeight + rect.size .height + positiveDirectionHeight;
64+ rect.origin .y -= negativeDirectionHeight;
65+ return rect;
66+ }
67+
68+ extern CGRect CGRectExpandToRangeWithScrollableDirections (CGRect rect, ASRangeTuningParameters tuningParameters,
69+ ASScrollDirection scrollableDirections, ASScrollDirection scrollDirection)
70+ {
71+ // Can scroll horizontally - expand the range appropriately
72+ if (ASScrollDirectionContainsHorizontalDirection (scrollableDirections)) {
73+ ASDirectionalScreenfulBuffer horizontalBuffer = ASDirectionalScreenfulBufferHorizontal (scrollDirection, tuningParameters);
74+ rect = CGRectExpandHorizontally (rect, horizontalBuffer);
75+ }
76+
77+ // Can scroll vertically - expand the range appropriately
78+ if (ASScrollDirectionContainsVerticalDirection (scrollableDirections)) {
79+ ASDirectionalScreenfulBuffer verticalBuffer = ASDirectionalScreenfulBufferVertical (scrollDirection, tuningParameters);
80+ rect = CGRectExpandVertically (rect, verticalBuffer);
81+ }
82+
83+ return rect;
84+ }
85+
2286@interface ASAbstractLayoutController () {
2387 std::vector<std::vector<ASRangeTuningParameters>> _tuningParameters;
2488 CGSize _viewportSize;
0 commit comments