From d82592f0727db8e6a5a7a7d2d226a8853f755826 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Thu, 8 Jan 2026 21:36:01 +0200 Subject: [PATCH] Fix full-screen back gesture over PagerView on iOS 26 (#9659) Patches react-native-pager-view to handle iOS 26's interactiveContentPopGestureRecognizer, using the same logic that already exists for RNSPanGestureRecognizer: on the leftmost page, disable the scrollview's pan gesture to let the back gesture through. Co-authored-by: Claude Opus 4.5 --- patches/react-native-pager-view+6.8.0.patch | 30 +++++++++++++++++++ .../react-native-pager-view+6.8.0.patch.md | 11 +++++++ 2 files changed, 41 insertions(+) create mode 100644 patches/react-native-pager-view+6.8.0.patch create mode 100644 patches/react-native-pager-view+6.8.0.patch.md diff --git a/patches/react-native-pager-view+6.8.0.patch b/patches/react-native-pager-view+6.8.0.patch new file mode 100644 index 0000000000..5d7a3dffce --- /dev/null +++ b/patches/react-native-pager-view+6.8.0.patch @@ -0,0 +1,30 @@ +diff --git a/node_modules/react-native-pager-view/ios/RNCPagerView.m b/node_modules/react-native-pager-view/ios/RNCPagerView.m +index adfc7c6..366df60 100644 +--- a/node_modules/react-native-pager-view/ios/RNCPagerView.m ++++ b/node_modules/react-native-pager-view/ios/RNCPagerView.m +@@ -498,6 +498,25 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecogni + return YES; + } + ++ // iOS 26+ full-screen back gesture (interactiveContentPopGestureRecognizer) ++ if (@available(iOS 26, *)) { ++ if (gestureRecognizer == self.panGestureRecognizer && ++ otherGestureRecognizer == self.reactViewController.navigationController.interactiveContentPopGestureRecognizer) { ++ UIPanGestureRecognizer* panGestureRecognizer = (UIPanGestureRecognizer*) gestureRecognizer; ++ CGPoint velocity = [panGestureRecognizer velocityInView:self]; ++ BOOL isLTR = [self isLtrLayout]; ++ BOOL isBackGesture = (isLTR && velocity.x > 0) || (!isLTR && velocity.x < 0); ++ ++ if (self.currentIndex == 0 && isBackGesture) { ++ self.scrollView.panGestureRecognizer.enabled = false; ++ } else { ++ self.scrollView.panGestureRecognizer.enabled = self.scrollEnabled; ++ } ++ ++ return YES; ++ } ++ } ++ + self.scrollView.panGestureRecognizer.enabled = self.scrollEnabled; + return NO; + } diff --git a/patches/react-native-pager-view+6.8.0.patch.md b/patches/react-native-pager-view+6.8.0.patch.md new file mode 100644 index 0000000000..fd22b8376e --- /dev/null +++ b/patches/react-native-pager-view+6.8.0.patch.md @@ -0,0 +1,11 @@ +# react-native-pager-view+6.8.0.patch + +Adds support for iOS 26's `interactiveContentPopGestureRecognizer` (full-screen back gesture). + +The pager already handles `RNSPanGestureRecognizer` (react-native-screens' custom full-screen gesture for pre-iOS 26) in `shouldRecognizeSimultaneouslyWithGestureRecognizer:`. It checks if the user is on the leftmost page and swiping right - if so, it disables the scrollview's pan gesture to let the back gesture through. + +This patch adds the same logic for iOS 26's native `interactiveContentPopGestureRecognizer`, so the back gesture works on the leftmost page while the pager still handles swipes on other pages. + +Related issues: +- https://github.com/software-mansion/react-native-screens/issues/3512 +- https://github.com/software-mansion/react-native-screens/pull/3420