15
15
16
16
using namespace facebook ::react;
17
17
18
- @interface RNCPagerViewComponentView () <RCTRNCViewPagerViewProtocol, UIPageViewControllerDataSource, UIPageViewControllerDelegate, UIScrollViewDelegate, UIGestureRecognizerDelegate>
19
-
20
- @property (nonatomic , assign ) UIPanGestureRecognizer* panGestureRecognizer;
21
-
18
+ @interface RNCPagerViewComponentView () <RCTRNCViewPagerViewProtocol, UIScrollViewDelegate>
22
19
@end
23
20
24
21
@implementation RNCPagerViewComponentView {
25
22
RNCViewPagerShadowNode::ConcreteState::Shared _state;
26
23
UIScrollView *_scrollView;
27
24
UIView *_containerView;
28
-
25
+
29
26
CGSize _contentSize;
30
27
NSInteger _initialPage;
31
28
}
@@ -35,73 +32,29 @@ - (instancetype)initWithFrame:(CGRect)frame
35
32
if (self = [super initWithFrame: frame]) {
36
33
static const auto defaultProps = std::make_shared<const RNCViewPagerProps>();
37
34
_props = defaultProps;
38
- _nativeChildrenViewControllers = [[NSMutableArray alloc ] init ];
39
- _currentIndex = -1 ;
40
- _destinationIndex = -1 ;
41
- _layoutDirection = @" ltr" ;
42
- _overdrag = NO ;
43
- UIPanGestureRecognizer* panGestureRecognizer = [UIPanGestureRecognizer new ];
44
- self.panGestureRecognizer = panGestureRecognizer;
45
- panGestureRecognizer.delegate = self;
46
- [self addGestureRecognizer: panGestureRecognizer];
47
-
35
+ _initialPage = -1 ;
36
+
37
+ _scrollView = [[UIScrollView alloc ] initWithFrame: self .bounds];
38
+
39
+ _scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
40
+ _scrollView.delaysContentTouches = NO ;
41
+ _scrollView.delegate = self;
42
+ _scrollView.pagingEnabled = YES ;
43
+ _scrollView.showsHorizontalScrollIndicator = NO ;
44
+ _scrollView.showsVerticalScrollIndicator = NO ;
45
+
46
+ [self addSubview: _scrollView];
47
+
48
+ _containerView = [[UIView alloc ] initWithFrame: CGRectZero];
49
+
50
+ [_scrollView addSubview: _containerView];
48
51
}
49
52
50
53
return self;
51
54
}
52
55
53
- #pragma mark - React API
54
-
55
- - (void )mountChildComponentView : (UIView<RCTComponentViewProtocol> *)childComponentView index : (NSInteger )index {
56
- UIViewController *wrapper = [[UIViewController alloc ] initWithView: childComponentView];
57
- [_nativeChildrenViewControllers insertObject: wrapper atIndex: index];
58
- }
59
-
60
- - (void )unmountChildComponentView : (UIView<RCTComponentViewProtocol> *)childComponentView index : (NSInteger )index {
61
- [[_nativeChildrenViewControllers objectAtIndex: index].view removeFromSuperview ];
62
- [_nativeChildrenViewControllers objectAtIndex: index].view = nil ;
63
- [_nativeChildrenViewControllers removeObjectAtIndex: index];
64
-
65
- NSInteger maxPage = _nativeChildrenViewControllers.count - 1 ;
66
-
67
- if (self.currentIndex >= maxPage) {
68
- [self goTo: maxPage animated: NO ];
69
- }
70
- }
71
-
72
-
73
- -(void )updateLayoutMetrics : (const facebook::react::LayoutMetrics &)layoutMetrics oldLayoutMetrics : (const facebook::react::LayoutMetrics &)oldLayoutMetrics {
74
- [super updateLayoutMetrics: layoutMetrics oldLayoutMetrics: _layoutMetrics];
75
- self.contentView .frame = RCTCGRectFromRect (_layoutMetrics.getContentFrame ());
76
- _layoutMetrics = layoutMetrics;
77
- }
78
-
79
-
80
- -(void )prepareForRecycle {
81
- [super prepareForRecycle ];
82
-
83
- _nativeChildrenViewControllers = [[NSMutableArray alloc ] init ];
84
- [_nativePageViewController.view removeFromSuperview ];
85
- _nativePageViewController = nil ;
86
-
87
- _currentIndex = -1 ;
88
- }
89
-
90
- - (void )shouldDismissKeyboard : (RNCViewPagerKeyboardDismissMode)dismissKeyboard {
91
- #if !TARGET_OS_VISION
92
- UIScrollViewKeyboardDismissMode dismissKeyboardMode = UIScrollViewKeyboardDismissModeNone;
93
- switch (dismissKeyboard) {
94
- case RNCViewPagerKeyboardDismissMode::None:
95
- dismissKeyboardMode = UIScrollViewKeyboardDismissModeNone;
96
- break ;
97
- case RNCViewPagerKeyboardDismissMode::OnDrag:
98
- dismissKeyboardMode = UIScrollViewKeyboardDismissModeOnDrag;
99
- break ;
100
- }
101
- scrollView.keyboardDismissMode = dismissKeyboardMode;
102
- #endif
103
- }
104
56
57
+ #pragma mark - React API
105
58
106
59
- (void )updateProps : (const facebook::react::Props::Shared &)props oldProps : (const facebook::react::Props::Shared &)oldProps {
107
60
const auto &oldScreenProps = *std::static_pointer_cast<const RNCViewPagerProps>(_props);
@@ -206,23 +159,6 @@ - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoi
206
159
207
160
const auto strongEventEmitter = *std::dynamic_pointer_cast<const RNCViewPagerEventEmitter>(_eventEmitter);
208
161
strongEventEmitter.onPageScrollStateChanged (RNCViewPagerEventEmitter::OnPageScrollStateChanged{.pageScrollState = RNCViewPagerEventEmitter::OnPageScrollStateChangedPageScrollState::Settling });
209
-
210
- if (!_overdrag) {
211
- NSInteger maxIndex = _nativeChildrenViewControllers.count - 1 ;
212
- BOOL isFirstPage = [self isLtrLayout ] ? _currentIndex == 0 : _currentIndex == maxIndex;
213
- BOOL isLastPage = [self isLtrLayout ] ? _currentIndex == maxIndex : _currentIndex == 0 ;
214
- CGFloat contentOffset = [self isHorizontal ] ? scrollView.contentOffset .x : scrollView.contentOffset .y ;
215
- CGFloat topBound = [self isHorizontal ] ? scrollView.bounds .size .width : scrollView.bounds .size .height ;
216
-
217
- if ((isFirstPage && contentOffset <= topBound) || (isLastPage && contentOffset >= topBound)) {
218
- CGPoint croppedOffset = [self isHorizontal ] ? CGPointMake (topBound, 0 ) : CGPointMake (0 , topBound);
219
- *targetContentOffset = croppedOffset;
220
-
221
- strongEventEmitter.onPageScrollStateChanged (RNCViewPagerEventEmitter::OnPageScrollStateChanged{.pageScrollState = RNCViewPagerEventEmitter::OnPageScrollStateChangedPageScrollState::Idle });
222
- }
223
- }
224
-
225
-
226
162
}
227
163
228
164
- (void )scrollViewDidEndDecelerating : (UIScrollView *)scrollView {
@@ -300,29 +236,6 @@ + (ComponentDescriptorProvider)componentDescriptorProvider
300
236
}
301
237
302
238
303
- - (BOOL )gestureRecognizer : (UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer : (UIGestureRecognizer *)otherGestureRecognizer {
304
-
305
- // Recognize simultaneously only if the other gesture is RN Screen's pan gesture (one that is used to perform fullScreenGestureEnabled)
306
- if (gestureRecognizer == self.panGestureRecognizer && [NSStringFromClass ([otherGestureRecognizer class ]) isEqual: @" RNSPanGestureRecognizer" ]) {
307
- UIPanGestureRecognizer* panGestureRecognizer = (UIPanGestureRecognizer*) gestureRecognizer;
308
- CGPoint velocity = [panGestureRecognizer velocityInView: self ];
309
- BOOL isLTR = [self isLtrLayout ];
310
- BOOL isBackGesture = (isLTR && velocity.x > 0 ) || (!isLTR && velocity.x < 0 );
311
-
312
- if (self.currentIndex == 0 && isBackGesture) {
313
- scrollView.panGestureRecognizer .enabled = false ;
314
- } else {
315
- const auto &viewProps = *std::static_pointer_cast<const RNCViewPagerProps>(_props);
316
- scrollView.panGestureRecognizer .enabled = viewProps.scrollEnabled ;
317
- }
318
-
319
- return YES ;
320
- }
321
- const auto &viewProps = *std::static_pointer_cast<const RNCViewPagerProps>(_props);
322
- scrollView.panGestureRecognizer .enabled = viewProps.scrollEnabled ;
323
- return NO ;
324
- }
325
-
326
239
@end
327
240
328
241
Class <RCTComponentViewProtocol> RNCViewPagerCls (void )
0 commit comments