From de6ebd638eb6318d0e24f61e7f487238d6acbf8b Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Wed, 6 Jul 2022 14:58:45 +0200 Subject: [PATCH 1/6] fix: add checks for iOS version around gestureRecognizer:shouldReceiveEvent: method However for iOS < 13.4 swiping wont work correctly I guess --- ios/RNSScreenStack.mm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index 915059c403..0a600eee8d 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -812,6 +812,8 @@ - (BOOL)isScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognize return scrollView.panGestureRecognizer == gestureRecognizer; } +#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_4) && \ + __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_4 // RNSScreenStackView is a UIGestureRecognizerDelegate for three types of gesture recognizers: // RNSPanGestureRecognizer, RNSScreenEdgeGestureRecognizer, _UIParallaxTransitionPanGestureRecognizer // Be careful when adding another type of gesture recognizer. @@ -832,6 +834,7 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive // RNSScreenEdgeGestureRecognizer || _UIParallaxTransitionPanGestureRecognizer return YES; } +#endif // check for 13.4 iOS version - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer From d91df078005707848215480fed83218082c05fd1 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Wed, 6 Jul 2022 15:08:23 +0200 Subject: [PATCH 2/6] chore: add API_AVAIABLE macro --- ios/RNSScreenStack.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index 0a600eee8d..6c1dc0129a 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -817,7 +817,8 @@ - (BOOL)isScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognize // RNSScreenStackView is a UIGestureRecognizerDelegate for three types of gesture recognizers: // RNSPanGestureRecognizer, RNSScreenEdgeGestureRecognizer, _UIParallaxTransitionPanGestureRecognizer // Be careful when adding another type of gesture recognizer. -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveEvent:(UIEvent *)event +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer + shouldReceiveEvent:(UIEvent *)event API_AVAILABLE(ios(13.4)) { RNSScreenView *topScreen = (RNSScreenView *)_controller.viewControllers.lastObject.view; From 8facc6b2d265eaa2dc055ccf921b129188848032 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Wed, 6 Jul 2022 17:42:50 +0200 Subject: [PATCH 3/6] fix: checks for iOS version --- ios/RNSScreenStack.mm | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index 6c1dc0129a..57362e1996 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -18,6 +18,7 @@ #import #endif // RN_FABRIC_ENABLED +#import #import "RNSScreen.h" #import "RNSScreenStack.h" #import "RNSScreenStackAnimator.h" @@ -605,7 +606,7 @@ - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer return YES; #else // RNSPanGestureRecognizer will receive events iff topScreen.fullScreenSwipeEnabled == YES; - // Events are filtered in gestureRecognizer:shouldReceiveEvent: method + // Events are filtered in gestureRecognizer:shouldReceivePressOrTouchEvent: method if ([gestureRecognizer isKindOfClass:[RNSPanGestureRecognizer class]]) { if ([self isInGestureResponseDistance:gestureRecognizer topScreen:topScreen]) { _isFullWidthSwiping = YES; @@ -812,13 +813,11 @@ - (BOOL)isScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognize return scrollView.panGestureRecognizer == gestureRecognizer; } -#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_4) && \ - __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_4 +// Custom method for compatibility with iOS < 13.4 // RNSScreenStackView is a UIGestureRecognizerDelegate for three types of gesture recognizers: // RNSPanGestureRecognizer, RNSScreenEdgeGestureRecognizer, _UIParallaxTransitionPanGestureRecognizer // Be careful when adding another type of gesture recognizer. -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer - shouldReceiveEvent:(UIEvent *)event API_AVAILABLE(ios(13.4)) +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePressOrTouchEvent:(NSObject *)event { RNSScreenView *topScreen = (RNSScreenView *)_controller.viewControllers.lastObject.view; @@ -835,6 +834,24 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer // RNSScreenEdgeGestureRecognizer || _UIParallaxTransitionPanGestureRecognizer return YES; } + +#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_13_4) && \ + __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_13_4 +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer + shouldReceiveEvent:(UIEvent *)event API_AVAILABLE(ios(13.4)) +{ + return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:event]; +} +#else +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press; +{ + return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:press]; +} + +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; +{ + return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:touch]; +} #endif // check for 13.4 iOS version - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer From 5a47fb4d79158b4c666ce26794ab471313fdb58c Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Thu, 7 Jul 2022 11:53:58 +0200 Subject: [PATCH 4/6] chore: remove #if directive --- ios/RNSScreenStack.mm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index 57362e1996..e6c9b37d0d 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -835,14 +835,12 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive return YES; } -#if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_13_4) && \ - __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_13_4 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveEvent:(UIEvent *)event API_AVAILABLE(ios(13.4)) { return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:event]; } -#else + - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press; { return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:press]; @@ -852,7 +850,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive { return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:touch]; } -#endif // check for 13.4 iOS version - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer From aa41f728a46ba12a28185b4feb3b25cf0c66566b Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Thu, 7 Jul 2022 12:07:51 +0200 Subject: [PATCH 5/6] chore: remove unused header --- ios/RNSScreenStack.mm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index e6c9b37d0d..410ea9ac65 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -18,7 +18,6 @@ #import #endif // RN_FABRIC_ENABLED -#import #import "RNSScreen.h" #import "RNSScreenStack.h" #import "RNSScreenStackAnimator.h" @@ -835,8 +834,7 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive return YES; } -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer - shouldReceiveEvent:(UIEvent *)event API_AVAILABLE(ios(13.4)) +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveEvent:(UIEvent *)event { return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:event]; } From df93a7543756f64da38c479896070008bd595b7d Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Thu, 7 Jul 2022 12:16:02 +0200 Subject: [PATCH 6/6] chore: remove `gestureRecognizer:shouldReceiveEvent: method This method is not necessary if we use both methods from the older API --- ios/RNSScreenStack.mm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index 410ea9ac65..b9f502bcdb 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -834,11 +834,6 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive return YES; } -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveEvent:(UIEvent *)event -{ - return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:event]; -} - - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceivePress:(UIPress *)press; { return [self gestureRecognizer:gestureRecognizer shouldReceivePressOrTouchEvent:press];