1515
1616using namespace facebook ::react;
1717
18- @interface RNCPagerViewComponentView () <RCTRNCViewPagerViewProtocol, UIPageViewControllerDataSource, UIPageViewControllerDelegate, UIScrollViewDelegate, UIGestureRecognizerDelegate>
19-
20- @property (nonatomic , assign ) UIPanGestureRecognizer* panGestureRecognizer;
21-
18+ @interface RNCPagerViewComponentView () <RCTRNCViewPagerViewProtocol, UIScrollViewDelegate>
2219@end
2320
2421@implementation RNCPagerViewComponentView {
2522 RNCViewPagerShadowNode::ConcreteState::Shared _state;
2623 UIScrollView *_scrollView;
2724 UIView *_containerView;
28-
25+
2926 CGSize _contentSize;
3027 NSInteger _initialPage;
3128}
@@ -35,73 +32,29 @@ - (instancetype)initWithFrame:(CGRect)frame
3532 if (self = [super initWithFrame: frame]) {
3633 static const auto defaultProps = std::make_shared<const RNCViewPagerProps>();
3734 _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];
4851 }
4952
5053 return self;
5154}
5255
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- }
10456
57+ #pragma mark - React API
10558
10659- (void )updateProps : (const facebook::react::Props::Shared &)props oldProps : (const facebook::react::Props::Shared &)oldProps {
10760 const auto &oldScreenProps = *std::static_pointer_cast<const RNCViewPagerProps>(_props);
@@ -206,23 +159,6 @@ - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoi
206159
207160 const auto strongEventEmitter = *std::dynamic_pointer_cast<const RNCViewPagerEventEmitter>(_eventEmitter);
208161 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-
226162}
227163
228164- (void )scrollViewDidEndDecelerating : (UIScrollView *)scrollView {
@@ -300,29 +236,6 @@ + (ComponentDescriptorProvider)componentDescriptorProvider
300236}
301237
302238
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-
326239@end
327240
328241Class <RCTComponentViewProtocol> RNCViewPagerCls (void )
0 commit comments