@onekeyfe/react-native-pager-view 3.0.172 → 3.0.173
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/reactnativepagerview/CollapsiblePagerHost.kt +21 -283
- package/android/src/main/java/com/reactnativepagerview/CollapsiblePagerViewManager.kt +0 -8
- package/android/src/main/java/com/reactnativepagerview/NativeScrollerView.kt +0 -2
- package/android/src/test/java/com/reactnativepagerview/NativeScrollerPendingRestoreTest.kt +0 -11
- package/docs/SPEC.md +1 -50
- package/ios/RNCCollapsiblePagerViewComponentView.mm +25 -275
- package/ios/RNCNativeScrollerComponentView.h +0 -1
- package/ios/RNCNativeScrollerComponentView.mm +0 -42
- package/ios/tests/RNCCollapsiblePagerFirstFrameTests.mm +0 -257
- package/package.json +2 -2
|
@@ -33,9 +33,6 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
33
33
|
@end
|
|
34
34
|
|
|
35
35
|
@implementation RNCNativeScrollerComponentView {
|
|
36
|
-
#if DEBUG
|
|
37
|
-
NSUInteger _offsetDiagSequence;
|
|
38
|
-
#endif
|
|
39
36
|
RNCNativeScrollerShadowNode::ConcreteState::Shared _state;
|
|
40
37
|
RNCNativeVerticalScrollView *_scrollView;
|
|
41
38
|
UIView<RCTComponentViewProtocol> *_reactContent;
|
|
@@ -54,24 +51,6 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
54
51
|
NSNumber *_lastContentViewportHeight;
|
|
55
52
|
}
|
|
56
53
|
|
|
57
|
-
- (void)offsetDiag:(NSString *)reason
|
|
58
|
-
{
|
|
59
|
-
#if DEBUG
|
|
60
|
-
Class logClass = NSClassFromString(@"ReactNativeNativeLogger.OneKeyLog") ?: NSClassFromString(@"OneKeyLog");
|
|
61
|
-
SEL selector = NSSelectorFromString(@"debug::");
|
|
62
|
-
if (logClass == nil || ![logClass respondsToSelector:selector]) return;
|
|
63
|
-
NSString *message = [NSString stringWithFormat:
|
|
64
|
-
@"[HOME-OFFSET-DIAG] scroller phase=%@ seq=%lu wallMs=%.0f mono=%.6f host=%p tag=%ld scroll=%p generation=%lu physicalY=%.4f insetTop=%.4f logicalY=%.4f contentHeight=%.4f boundsHeight=%.4f adjustedBottom=%.4f needsClamp=%d drag=%d decel=%d refresh=%d",
|
|
65
|
-
reason, (unsigned long)++_offsetDiagSequence, NSDate.date.timeIntervalSince1970 * 1000, CACurrentMediaTime(),
|
|
66
|
-
(__bridge void *)self, (long)self.tag, (__bridge void *)_scrollView, (unsigned long)_generation,
|
|
67
|
-
_scrollView.contentOffset.y, _scrollView.contentInset.top, _scrollView.contentOffset.y + _scrollView.contentInset.top,
|
|
68
|
-
_scrollView.contentSize.height, _scrollView.bounds.size.height, _scrollView.adjustedContentInset.bottom,
|
|
69
|
-
_needsContentClamp, _scrollView.dragging, _scrollView.decelerating, _refreshControl.refreshing];
|
|
70
|
-
typedef void (*LogFunction)(id, SEL, NSString *, NSString *);
|
|
71
|
-
((LogFunction)[logClass methodForSelector:selector])(logClass, selector, @"NativeScroller", message);
|
|
72
|
-
#endif
|
|
73
|
-
}
|
|
74
|
-
|
|
75
54
|
+ (ComponentDescriptorProvider)componentDescriptorProvider
|
|
76
55
|
{
|
|
77
56
|
return concreteComponentDescriptorProvider<RNCNativeScrollerComponentDescriptor>();
|
|
@@ -200,9 +179,7 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
200
179
|
_needsContentClamp |= size.height < _scrollView.contentSize.height;
|
|
201
180
|
CGPoint offset = _scrollView.contentOffset;
|
|
202
181
|
BOOL wasPulling = offset.y < -_scrollView.adjustedContentInset.top;
|
|
203
|
-
[self offsetDiag:@"content-size-before"];
|
|
204
182
|
_scrollView.contentSize = size;
|
|
205
|
-
[self offsetDiag:@"content-size-after"];
|
|
206
183
|
// UIKit can synchronously discard a pull when content becomes empty.
|
|
207
184
|
// Upper-range shrink correction remains owned by the deferred clamp.
|
|
208
185
|
if (wasPulling && _scrollView.contentOffset.y != offset.y) {
|
|
@@ -220,12 +197,10 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
220
197
|
- (void)updateLayoutMetrics:(const LayoutMetrics &)layoutMetrics
|
|
221
198
|
oldLayoutMetrics:(const LayoutMetrics &)oldLayoutMetrics
|
|
222
199
|
{
|
|
223
|
-
[self offsetDiag:@"layout-before"];
|
|
224
200
|
CGSize previous = _scrollView.bounds.size;
|
|
225
201
|
[super updateLayoutMetrics:layoutMetrics oldLayoutMetrics:oldLayoutMetrics];
|
|
226
202
|
[self updateFabricContentOrigin];
|
|
227
203
|
[self emitContentViewportChangeIfNeeded];
|
|
228
|
-
[self offsetDiag:@"layout-after"];
|
|
229
204
|
if (!CGSizeEqualToSize(previous, _scrollView.bounds.size)) {
|
|
230
205
|
_needsContentClamp = YES;
|
|
231
206
|
[self scheduleContentClamp];
|
|
@@ -288,7 +263,6 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
288
263
|
- (void)scheduleContentClamp
|
|
289
264
|
{
|
|
290
265
|
if (!_needsContentClamp) return;
|
|
291
|
-
[self offsetDiag:@"clamp-scheduled"];
|
|
292
266
|
NSUInteger generation = _generation;
|
|
293
267
|
__weak __typeof__(self) weakSelf = self;
|
|
294
268
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
@@ -300,19 +274,13 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
300
274
|
|
|
301
275
|
- (void)clampContentOffsetIfNeeded
|
|
302
276
|
{
|
|
303
|
-
[self offsetDiag:@"clamp-enter-or-deferred"];
|
|
304
277
|
if (!_needsContentClamp || _scrollView.dragging || _scrollView.decelerating ||
|
|
305
278
|
_refreshControl.refreshing || _scrollView.bounds.size.height <= 0) return;
|
|
306
279
|
_needsContentClamp = NO;
|
|
307
280
|
CGFloat maximum = MAX(-_scrollView.adjustedContentInset.top,
|
|
308
281
|
_scrollView.contentSize.height - _scrollView.bounds.size.height + _scrollView.adjustedContentInset.bottom);
|
|
309
|
-
#if DEBUG
|
|
310
|
-
[self offsetDiag:[NSString stringWithFormat:@"clamp-candidate-max=%.4f", maximum]];
|
|
311
|
-
#endif
|
|
312
282
|
if (_scrollView.contentOffset.y > maximum) {
|
|
313
|
-
[self offsetDiag:@"clamp-applied-before"];
|
|
314
283
|
[_scrollView setContentOffset:CGPointMake(_scrollView.contentOffset.x, maximum) animated:NO];
|
|
315
|
-
[self offsetDiag:@"clamp-applied-after"];
|
|
316
284
|
}
|
|
317
285
|
}
|
|
318
286
|
|
|
@@ -351,7 +319,6 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
351
319
|
- (void)stopScrolling
|
|
352
320
|
{
|
|
353
321
|
if (_stopping) return;
|
|
354
|
-
[self offsetDiag:@"stop-before"];
|
|
355
322
|
_stopping = YES;
|
|
356
323
|
[_scrollView setContentOffset:_scrollView.contentOffset animated:NO];
|
|
357
324
|
if (_dragActive) {
|
|
@@ -363,7 +330,6 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
363
330
|
}
|
|
364
331
|
[self finishMomentum];
|
|
365
332
|
_stopping = NO;
|
|
366
|
-
[self offsetDiag:@"stop-after"];
|
|
367
333
|
}
|
|
368
334
|
|
|
369
335
|
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
|
|
@@ -428,14 +394,6 @@ static Event RNCScrollerMetrics(UIScrollView *scroll, CGPoint velocity, CGPoint
|
|
|
428
394
|
- (void)scrollTo:(double)x y:(double)y animated:(BOOL)animated
|
|
429
395
|
{
|
|
430
396
|
if (_recycled || !isfinite(x) || !isfinite(y)) return;
|
|
431
|
-
for (UIView *owner = self.superview; owner != nil; owner = owner.superview) {
|
|
432
|
-
if ([owner conformsToProtocol:@protocol(RNCNativeScrollerInsetCoordinator)]) {
|
|
433
|
-
[(id<RNCNativeScrollerInsetCoordinator>)owner nativeScrollerWillReceiveScrollCommand:self];
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
#if DEBUG
|
|
437
|
-
[self offsetDiag:[NSString stringWithFormat:@"command-scrollTo-enter-x=%.4f-y=%.4f-animated=%d", x, y, animated]];
|
|
438
|
-
#endif
|
|
439
397
|
[self stopScrolling];
|
|
440
398
|
UIEdgeInsets inset = _scrollView.adjustedContentInset;
|
|
441
399
|
CGPoint target = CGPointMake(MAX(-inset.left, MIN(x,
|
|
@@ -6,25 +6,11 @@
|
|
|
6
6
|
using namespace facebook::react;
|
|
7
7
|
|
|
8
8
|
@interface RNCCollapsiblePagerViewComponentView (FirstFrameTesting)
|
|
9
|
-
- (void)mountingTransactionWillMount:(const MountingTransaction &)transaction
|
|
10
|
-
withSurfaceTelemetry:(const SurfaceTelemetry &)telemetry;
|
|
11
9
|
- (void)mountingTransactionDidMount:(const MountingTransaction &)transaction
|
|
12
10
|
withSurfaceTelemetry:(const SurfaceTelemetry &)telemetry;
|
|
13
11
|
- (UIScrollView *)findExplicitNativeScrollerInView:(UIView *)view;
|
|
14
12
|
- (UIScrollView *)findVerticalScrollViewInView:(UIView *)view;
|
|
15
13
|
- (void)attachScrollObserverForCurrentPage;
|
|
16
|
-
- (void)attachScrollObserverForCurrentPageAfterTransition:(BOOL)selectionSettled;
|
|
17
|
-
- (void)detachScrollObserver;
|
|
18
|
-
- (void)beginPageStateTransition;
|
|
19
|
-
- (void)updatePageStateTransitionProgress:(CGFloat)progress;
|
|
20
|
-
- (void)finishPageStateTransition;
|
|
21
|
-
- (void)preparePageForHorizontalTransitionAtIndex:(NSInteger)index;
|
|
22
|
-
- (void)applyInsetsToScrollView:(UIScrollView *)scrollView pageIndex:(NSInteger)index restore:(BOOL)restore;
|
|
23
|
-
@end
|
|
24
|
-
|
|
25
|
-
@interface RNCNativeScrollerComponentView (ScrollCommandTesting)
|
|
26
|
-
- (void)scrollTo:(double)x y:(double)y animated:(BOOL)animated;
|
|
27
|
-
- (void)scrollToEnd:(BOOL)animated;
|
|
28
14
|
@end
|
|
29
15
|
|
|
30
16
|
@interface RNCCollapsiblePagerFirstFrameTests : XCTestCase
|
|
@@ -32,249 +18,6 @@ using namespace facebook::react;
|
|
|
32
18
|
|
|
33
19
|
@implementation RNCCollapsiblePagerFirstFrameTests
|
|
34
20
|
|
|
35
|
-
- (void)testReachableTopCommandBeforeLayoutMustNotReplayPendingPagePosition
|
|
36
|
-
{
|
|
37
|
-
for (NSNumber *command in @[@0, @1, @2]) {
|
|
38
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:1];
|
|
39
|
-
RNCNativeScrollerComponentView *scroller = [self addScrollerToPager:pager atIndex:0];
|
|
40
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
41
|
-
offsets[@"page-0"] = @660;
|
|
42
|
-
scroller.scrollView.contentSize = CGSizeMake(0, 0);
|
|
43
|
-
[pager attachScrollObserverForCurrentPage];
|
|
44
|
-
XCTAssertTrue([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-0"]);
|
|
45
|
-
XCTAssertEqualObjects(offsets[@"page-0"], @660);
|
|
46
|
-
XCTAssertEqual([pager valueForKey:@"observedScrollView"], scroller.scrollView);
|
|
47
|
-
XCTAssertEqualObjects([pager valueForKey:@"observedPageKey"], @"page-0");
|
|
48
|
-
XCTAssertEqualObjects([pager valueForKey:@"currentIndex"], @0);
|
|
49
|
-
if (command.boolValue) {
|
|
50
|
-
if (command.integerValue == 2) {
|
|
51
|
-
CGFloat reachableEndQ = MAX(-scroller.scrollView.adjustedContentInset.top,
|
|
52
|
-
scroller.scrollView.contentSize.height - scroller.scrollView.bounds.size.height +
|
|
53
|
-
scroller.scrollView.adjustedContentInset.bottom) + scroller.scrollView.contentInset.top;
|
|
54
|
-
XCTAssertEqualWithAccuracy(reachableEndQ, 120, 0.01);
|
|
55
|
-
XCTAssertEqualWithAccuracy(scroller.scrollView.contentOffset.y + scroller.scrollView.contentInset.top, reachableEndQ, 0.01);
|
|
56
|
-
[scroller scrollToEnd:NO];
|
|
57
|
-
}
|
|
58
|
-
else [scroller scrollTo:0 y:-scroller.scrollView.adjustedContentInset.top animated:NO];
|
|
59
|
-
XCTAssertEqualWithAccuracy(scroller.scrollView.contentOffset.y + scroller.scrollView.contentInset.top, command.integerValue == 2 ? 120 : 0, 0.01);
|
|
60
|
-
XCTAssertFalse([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-0"]);
|
|
61
|
-
XCTAssertEqualWithAccuracy([offsets[@"page-0"] doubleValue], command.integerValue == 2 ? 120 : 0, 0.01);
|
|
62
|
-
XCTAssertEqual([pager valueForKey:@"observedScrollView"], scroller.scrollView);
|
|
63
|
-
XCTAssertEqualObjects([pager valueForKey:@"observedPageKey"], @"page-0");
|
|
64
|
-
}
|
|
65
|
-
// The existing observed content-size path retries the pending restoration.
|
|
66
|
-
scroller.scrollView.contentSize = CGSizeMake(320, 1500);
|
|
67
|
-
XCTAssertFalse([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-0"]);
|
|
68
|
-
CGFloat expected = command.integerValue == 2 ? 120 : (command.boolValue ? 0 : 660);
|
|
69
|
-
XCTAssertEqualWithAccuracy(scroller.scrollView.contentOffset.y + scroller.scrollView.contentInset.top,
|
|
70
|
-
expected, 0.01, @"command=%@ must not replay a cancelled reading position", command);
|
|
71
|
-
XCTAssertEqualWithAccuracy([[pager valueForKey:@"headerOffset"] doubleValue], command.integerValue == 1 ? 0 : 120, 0.01);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
- (void)testScrollCommandCancellationRespectsOwnerAndValidity
|
|
76
|
-
{
|
|
77
|
-
for (NSNumber *mode in @[@0, @1, @2]) {
|
|
78
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:2];
|
|
79
|
-
RNCNativeScrollerComponentView *current = [self addScrollerToPager:pager atIndex:0];
|
|
80
|
-
RNCNativeScrollerComponentView *other = [self addScrollerToPager:pager atIndex:1];
|
|
81
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
82
|
-
offsets[@"page-0"] = @660;
|
|
83
|
-
offsets[@"page-1"] = @360;
|
|
84
|
-
current.scrollView.contentSize = CGSizeMake(0, 0);
|
|
85
|
-
[pager attachScrollObserverForCurrentPage];
|
|
86
|
-
XCTAssertTrue([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-0"]);
|
|
87
|
-
if (mode.integerValue == 0) {
|
|
88
|
-
[current scrollTo:0 y:NAN animated:NO];
|
|
89
|
-
} else if (mode.integerValue == 1) {
|
|
90
|
-
[other scrollTo:0 y:-other.scrollView.adjustedContentInset.top animated:NO];
|
|
91
|
-
} else {
|
|
92
|
-
NSUInteger generation = [[pager valueForKey:@"generation"] unsignedIntegerValue];
|
|
93
|
-
[pager setValue:@(generation + 1) forKey:@"observedPageGeneration"];
|
|
94
|
-
[current scrollTo:0 y:-current.scrollView.adjustedContentInset.top animated:NO];
|
|
95
|
-
}
|
|
96
|
-
XCTAssertTrue([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-0"]);
|
|
97
|
-
XCTAssertEqualObjects(offsets[@"page-0"], @660);
|
|
98
|
-
XCTAssertEqualObjects(offsets[@"page-1"], @360);
|
|
99
|
-
}
|
|
100
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:2];
|
|
101
|
-
RNCNativeScrollerComponentView *current = [self addScrollerToPager:pager atIndex:0];
|
|
102
|
-
[self addScrollerToPager:pager atIndex:1];
|
|
103
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
104
|
-
offsets[@"page-0"] = @0;
|
|
105
|
-
offsets[@"page-1"] = @360;
|
|
106
|
-
[pager attachScrollObserverForCurrentPage];
|
|
107
|
-
XCTAssertFalse([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-0"]);
|
|
108
|
-
[current scrollTo:0 y:200 - current.scrollView.contentInset.top animated:NO];
|
|
109
|
-
XCTAssertEqualWithAccuracy(current.scrollView.contentOffset.y + current.scrollView.contentInset.top, 200, 0.01);
|
|
110
|
-
XCTAssertEqualWithAccuracy([offsets[@"page-0"] doubleValue], 200, 0.01);
|
|
111
|
-
XCTAssertEqualObjects(offsets[@"page-1"], @360);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
- (void)testTransitionLayoutCannotSaveSourceOffsetIntoDestinationCache
|
|
115
|
-
{
|
|
116
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:2];
|
|
117
|
-
RNCNativeScrollerComponentView *source = [self addScrollerToPager:pager atIndex:0];
|
|
118
|
-
RNCNativeScrollerComponentView *target = [self addScrollerToPager:pager atIndex:1];
|
|
119
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
120
|
-
offsets[@"page-0"] = @120;
|
|
121
|
-
offsets[@"page-1"] = @660;
|
|
122
|
-
[pager setValue:@120 forKey:@"headerOffset"];
|
|
123
|
-
[pager attachScrollObserverForCurrentPage];
|
|
124
|
-
XCTAssertEqualWithAccuracy(source.scrollView.contentOffset.y + source.scrollView.contentInset.top, 120, 0.01);
|
|
125
|
-
XCTAssertEqualObjects([pager valueForKey:@"headerOffset"], @120);
|
|
126
|
-
XCTAssertEqualObjects(offsets[@"page-1"], @660);
|
|
127
|
-
[pager detachScrollObserver];
|
|
128
|
-
[pager setValue:@YES forKey:@"transitioning"];
|
|
129
|
-
// A layout pass runs between programmatic transition start and completion.
|
|
130
|
-
[pager attachScrollObserverForCurrentPage];
|
|
131
|
-
[pager setValue:@1 forKey:@"currentIndex"];
|
|
132
|
-
[pager attachScrollObserverForCurrentPageAfterTransition:YES];
|
|
133
|
-
XCTAssertEqualWithAccuracy([offsets[@"page-1"] doubleValue], 660, 0.01);
|
|
134
|
-
XCTAssertEqualWithAccuracy(target.scrollView.contentOffset.y + target.scrollView.contentInset.top, 660, 0.01);
|
|
135
|
-
XCTAssertNotEqual([pager valueForKey:@"observedScrollView"], source.scrollView);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
- (void)testSmoothTransitionRestoresWholePagePositionsAndCancellation
|
|
139
|
-
{
|
|
140
|
-
for (NSNumber *targetQ in @[@0, @60, @660]) {
|
|
141
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:2];
|
|
142
|
-
RNCNativeScrollerComponentView *source = [self addScrollerToPager:pager atIndex:0];
|
|
143
|
-
RNCNativeScrollerComponentView *target = [self addScrollerToPager:pager atIndex:1];
|
|
144
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
145
|
-
offsets[@"page-0"] = @0;
|
|
146
|
-
offsets[@"page-1"] = targetQ;
|
|
147
|
-
[pager attachScrollObserverForCurrentPage];
|
|
148
|
-
[pager beginPageStateTransition];
|
|
149
|
-
[pager setValue:@YES forKey:@"isPagerDragging"];
|
|
150
|
-
[pager setValue:@YES forKey:@"transitioning"];
|
|
151
|
-
[pager updatePageStateTransitionProgress:0.5];
|
|
152
|
-
CGFloat displayH = MIN(targetQ.doubleValue, 120) / 2;
|
|
153
|
-
XCTAssertEqualWithAccuracy([[pager valueForKey:@"headerOffset"] doubleValue], displayH, 0.01);
|
|
154
|
-
XCTAssertEqualWithAccuracy(source.scrollView.contentOffset.y + source.scrollView.contentInset.top, displayH, 0.01);
|
|
155
|
-
XCTAssertEqualWithAccuracy(target.scrollView.contentOffset.y + target.scrollView.contentInset.top,
|
|
156
|
-
MAX(targetQ.doubleValue - 120, 0) + displayH, 0.01);
|
|
157
|
-
XCTAssertEqualObjects(offsets[@"page-0"], @0);
|
|
158
|
-
XCTAssertEqualObjects(offsets[@"page-1"], targetQ);
|
|
159
|
-
// Cancelling the swipe restores both pages, not just the selected source.
|
|
160
|
-
[pager finishPageStateTransition];
|
|
161
|
-
XCTAssertEqualWithAccuracy(source.scrollView.contentOffset.y + source.scrollView.contentInset.top, 0, 0.01);
|
|
162
|
-
XCTAssertEqualWithAccuracy(target.scrollView.contentOffset.y + target.scrollView.contentInset.top, targetQ.doubleValue, 0.01);
|
|
163
|
-
XCTAssertEqualObjects(offsets[@"page-1"], targetQ);
|
|
164
|
-
[pager setValue:@NO forKey:@"isPagerDragging"];
|
|
165
|
-
[pager setValue:@NO forKey:@"transitioning"];
|
|
166
|
-
[pager attachScrollObserverForCurrentPage];
|
|
167
|
-
[pager beginPageStateTransition];
|
|
168
|
-
[pager setValue:@1 forKey:@"destinationIndex"];
|
|
169
|
-
[pager preparePageForHorizontalTransitionAtIndex:1];
|
|
170
|
-
[pager updatePageStateTransitionProgress:1];
|
|
171
|
-
XCTAssertEqualWithAccuracy(source.scrollView.contentOffset.y + source.scrollView.contentInset.top,
|
|
172
|
-
MIN(targetQ.doubleValue, 120), 0.01);
|
|
173
|
-
[pager setValue:@1 forKey:@"currentIndex"];
|
|
174
|
-
[pager attachScrollObserverForCurrentPageAfterTransition:YES];
|
|
175
|
-
XCTAssertEqualWithAccuracy(target.scrollView.contentOffset.y + target.scrollView.contentInset.top, targetQ.doubleValue, 0.01);
|
|
176
|
-
XCTAssertEqualWithAccuracy([[pager valueForKey:@"headerOffset"] doubleValue], MIN(targetQ.doubleValue, 120), 0.01);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
- (void)testNonAdjacentTransitionUsesFixedEndpointsAndRestoresIntermediatePage
|
|
181
|
-
{
|
|
182
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:4];
|
|
183
|
-
for (NSInteger index = 0; index < 4; index++) [self addScrollerToPager:pager atIndex:index];
|
|
184
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
185
|
-
offsets[@"page-0"] = @0;
|
|
186
|
-
offsets[@"page-1"] = @60;
|
|
187
|
-
offsets[@"page-2"] = @360;
|
|
188
|
-
offsets[@"page-3"] = @660;
|
|
189
|
-
[pager attachScrollObserverForCurrentPage];
|
|
190
|
-
[pager beginPageStateTransition];
|
|
191
|
-
[pager setValue:@3 forKey:@"destinationIndex"];
|
|
192
|
-
[pager preparePageForHorizontalTransitionAtIndex:3];
|
|
193
|
-
[pager updatePageStateTransitionProgress:1];
|
|
194
|
-
XCTAssertEqualWithAccuracy([[pager valueForKey:@"headerOffset"] doubleValue], 40, 0.01);
|
|
195
|
-
[pager setValue:@3 forKey:@"currentIndex"];
|
|
196
|
-
[pager attachScrollObserverForCurrentPageAfterTransition:YES];
|
|
197
|
-
XCTAssertEqualObjects(offsets[@"page-1"], @60);
|
|
198
|
-
XCTAssertEqualObjects(offsets[@"page-2"], @360);
|
|
199
|
-
XCTAssertEqualObjects(offsets[@"page-3"], @660);
|
|
200
|
-
for (NSInteger index = 1; index < 4; index++) {
|
|
201
|
-
UIViewController *page = [pager valueForKey:@"pageControllers"][index];
|
|
202
|
-
RNCNativeScrollerComponentView *scroller = page.view.subviews.firstObject;
|
|
203
|
-
NSString *key = [NSString stringWithFormat:@"page-%ld", (long)index];
|
|
204
|
-
XCTAssertEqualWithAccuracy(scroller.scrollView.contentOffset.y + scroller.scrollView.contentInset.top,
|
|
205
|
-
[offsets[key] doubleValue], 0.01);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
- (void)testZeroLayoutPreservesPendingWholePageRestore
|
|
210
|
-
{
|
|
211
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:1];
|
|
212
|
-
RNCNativeScrollerComponentView *scroller = [self addScrollerToPager:pager atIndex:0];
|
|
213
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
214
|
-
offsets[@"page-0"] = @660;
|
|
215
|
-
scroller.scrollView.contentSize = CGSizeMake(0, 0);
|
|
216
|
-
[pager attachScrollObserverForCurrentPage];
|
|
217
|
-
XCTAssertEqualObjects(offsets[@"page-0"], @660);
|
|
218
|
-
XCTAssertTrue([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-0"]);
|
|
219
|
-
// Releasing an observed but unmeasured identity must retain its pending Q.
|
|
220
|
-
scroller.tag = 91001;
|
|
221
|
-
ShadowView removedView;
|
|
222
|
-
removedView.tag = (Tag)scroller.tag;
|
|
223
|
-
MountingTransaction removal(1, 1, {ShadowViewMutation::RemoveMutation(1, removedView, 0)}, {});
|
|
224
|
-
SurfaceTelemetry telemetry;
|
|
225
|
-
[pager mountingTransactionWillMount:removal withSurfaceTelemetry:telemetry];
|
|
226
|
-
XCTAssertEqualObjects(offsets[@"page-0"], @660);
|
|
227
|
-
[self finishMount:pager];
|
|
228
|
-
XCTAssertEqualObjects(offsets[@"page-0"], @660);
|
|
229
|
-
scroller.scrollView.contentSize = CGSizeMake(320, 1500);
|
|
230
|
-
XCTAssertEqualObjects(offsets[@"page-0"], @660);
|
|
231
|
-
XCTAssertFalse([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-0"]);
|
|
232
|
-
XCTAssertEqualWithAccuracy(scroller.scrollView.contentOffset.y + scroller.scrollView.contentInset.top, 660, 0.01);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
- (void)testUnresolvedReplacementDoesNotCommitTemporaryClamp
|
|
236
|
-
{
|
|
237
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:2];
|
|
238
|
-
RNCNativeScrollerComponentView *source = [self addScrollerToPager:pager atIndex:0];
|
|
239
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
240
|
-
offsets[@"page-0"] = @0;
|
|
241
|
-
offsets[@"page-1"] = @660;
|
|
242
|
-
[pager attachScrollObserverForCurrentPage];
|
|
243
|
-
[pager beginPageStateTransition];
|
|
244
|
-
[pager setValue:@1 forKey:@"destinationIndex"];
|
|
245
|
-
UICollectionView *replacement = [[UICollectionView alloc]
|
|
246
|
-
initWithFrame:CGRectMake(0, 0, 320, 600)
|
|
247
|
-
collectionViewLayout:[UICollectionViewFlowLayout new]];
|
|
248
|
-
UIViewController *page = [pager valueForKey:@"pageControllers"][1];
|
|
249
|
-
[page.view addSubview:replacement];
|
|
250
|
-
id released = [NSClassFromString(@"RNCCollapsiblePagerReleasedScrollState") new];
|
|
251
|
-
XCTAssertNotNil(released);
|
|
252
|
-
[released setValue:source.scrollView forKey:@"scrollView"];
|
|
253
|
-
[released setValue:source forKey:@"componentView"];
|
|
254
|
-
[released setValue:@(source.tag) forKey:@"componentTag"];
|
|
255
|
-
[pager valueForKey:@"releasedPageScrollStates"][@"page-1"] = released;
|
|
256
|
-
[pager preparePageForHorizontalTransitionAtIndex:1];
|
|
257
|
-
[pager setValue:@1 forKey:@"currentIndex"];
|
|
258
|
-
[pager finishPageStateTransition];
|
|
259
|
-
XCTAssertEqualObjects(offsets[@"page-1"], @660);
|
|
260
|
-
XCTAssertTrue([[pager valueForKey:@"pendingPageRestoreKeys"] containsObject:@"page-1"]);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
- (void)testRenamedPageDoesNotResurrectPrunedObserverCache
|
|
264
|
-
{
|
|
265
|
-
RNCCollapsiblePagerViewComponentView *pager = [self pagerWithPageCount:1];
|
|
266
|
-
RNCNativeScrollerComponentView *scroller = [self addScrollerToPager:pager atIndex:0];
|
|
267
|
-
NSMutableDictionary *offsets = [pager valueForKey:@"pageOffsets"];
|
|
268
|
-
offsets[@"page-0"] = @60;
|
|
269
|
-
[pager attachScrollObserverForCurrentPage];
|
|
270
|
-
[pager setValue:@[@"replacement-key"] forKey:@"pageKeys"];
|
|
271
|
-
[offsets removeObjectForKey:@"page-0"];
|
|
272
|
-
scroller.scrollView.contentOffset = CGPointMake(0, 200);
|
|
273
|
-
[pager detachScrollObserver];
|
|
274
|
-
XCTAssertNil(offsets[@"page-0"]);
|
|
275
|
-
XCTAssertNil(offsets[@"replacement-key"]);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
21
|
- (RNCCollapsiblePagerViewComponentView *)pagerWithPageCount:(NSInteger)count
|
|
279
22
|
{
|
|
280
23
|
RNCCollapsiblePagerViewComponentView *pager =
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/react-native-pager-view",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.173",
|
|
4
4
|
"description": "React Native wrapper for Android and iOS ViewPager",
|
|
5
5
|
"source": "./src/index.tsx",
|
|
6
6
|
"main": "./lib/module/index.js",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"typescript": "^5.9.2"
|
|
73
73
|
},
|
|
74
74
|
"peerDependencies": {
|
|
75
|
-
"@onekeyfe/react-native-native-logger": "3.0.
|
|
75
|
+
"@onekeyfe/react-native-native-logger": "3.0.173",
|
|
76
76
|
"react": "*",
|
|
77
77
|
"react-native": "*"
|
|
78
78
|
},
|