From 769a3a21500fbe40c1909c9bf50f724c76a5b435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nishan=20=28o=5E=E2=96=BD=5Eo=29?= Date: Fri, 24 Mar 2023 17:17:16 +0530 Subject: [PATCH] feat(ios): back gesture with full screen swipe (#705) * wip * wip * revert versions --- example/ios/Podfile.lock | 9 +- example/package.json | 8 +- example/yarn.lock | 133 +++++++++++++++--------- ios/Fabric/RNCPagerViewComponentView.mm | 33 +++++- ios/ReactNativePageView.m | 30 +++++- 5 files changed, 151 insertions(+), 62 deletions(-) diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 798085e7..2924146c 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -302,7 +302,7 @@ PODS: - React-jsinspector (0.70.5) - React-logger (0.70.5): - glog - - react-native-pager-view (6.1.1): + - react-native-pager-view (6.1.4): - React-Core - react-native-safe-area-context (3.4.1): - React-Core @@ -403,8 +403,9 @@ PODS: - React-RCTText - ReactCommon/turbomodule/core - Yoga - - RNScreens (2.18.1): + - RNScreens (3.20.0): - React-Core + - React-RCTImage - RNSVG (12.4.4): - React-Core - SocketRocket (0.6.0) @@ -617,7 +618,7 @@ SPEC CHECKSUMS: React-jsiexecutor: 31564fa6912459921568e8b0e49024285a4d584b React-jsinspector: badd81696361249893a80477983e697aab3c1a34 React-logger: fdda34dd285bdb0232e059b19d9606fa0ec3bb9c - react-native-pager-view: 3c66c4e2f3ab423643d07b2c7041f8ac48395f72 + react-native-pager-view: b58cb9e9f42f64e50cab3040815772c1d119a2e2 react-native-safe-area-context: 9e40fb181dac02619414ba1294d6c2a807056ab9 React-perflogger: e68d3795cf5d247a0379735cbac7309adf2fb931 React-RCTActionSheet: 05452c3b281edb27850253db13ecd4c5a65bc247 @@ -634,7 +635,7 @@ SPEC CHECKSUMS: RNCMaskedView: 0e1bc4bfa8365eba5fbbb71e07fbdc0555249489 RNGestureHandler: a479ebd5ed4221a810967000735517df0d2db211 RNReanimated: 2a91e85fcd343f8af3c58d3425b99fdd285590a5 - RNScreens: f7ad633b2e0190b77b6a7aab7f914fad6f198d8d + RNScreens: 218801c16a2782546d30bd2026bb625c0302d70f RNSVG: ecd661f380a07ba690c9c5929c475a44f432d674 SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 Yoga: eca980a5771bf114c41a754098cd85e6e0d90ed7 diff --git a/example/package.json b/example/package.json index e1d719f3..ac4ef7bd 100644 --- a/example/package.json +++ b/example/package.json @@ -11,16 +11,16 @@ }, "dependencies": { "@react-native-community/masked-view": "^0.1.10", - "@react-navigation/native": "^5.8.10", - "@react-navigation/native-stack": "5.0.4", - "@react-navigation/stack": "^5.12.8", + "@react-navigation/native": "~6.1.6", + "@react-navigation/native-stack": "~6.9.12", + "@react-navigation/stack": "~6.3.16", "react": "18.1.0", "react-native": "0.70.5", "react-native-animated-pagination-dots": "^0.1.73", "react-native-gesture-handler": "^1.9.0", "react-native-reanimated": "2.12.0", "react-native-safe-area-context": "^3.1.9", - "react-native-screens": "^2.16.1", + "react-native-screens": "~3.20.0", "react-native-svg": "12.4.4", "react-native-tab-view": "^3.1.1" }, diff --git a/example/yarn.lock b/example/yarn.lock index 534ab90f..dbad47d2 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -1295,45 +1295,56 @@ resolved "https://registry.yarnpkg.com/@react-native/polyfills/-/polyfills-2.0.0.tgz#4c40b74655c83982c8cf47530ee7dc13d957b6aa" integrity sha512-K0aGNn1TjalKj+65D7ycc1//H9roAQ51GJVk5ZJQFb2teECGmzd86bYDC0aYdbRf7gtovescq4Zt6FR0tgXiHQ== -"@react-navigation/core@^5.16.1": - version "5.16.1" - resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.16.1.tgz#e0d308bd9bbd930114ce55c4151806b6d7907f69" - integrity sha512-3AToC7vPNeSNcHFLd1h71L6u34hfXoRAS1CxF9Fc4uC8uOrVqcNvphpeFbE0O9Bw6Zpl0BnMFl7E5gaL3KGzNA== +"@react-navigation/core@^6.4.8": + version "6.4.8" + resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-6.4.8.tgz#a18e106d3c59cdcfc4ce53f7344e219ed35c88ed" + integrity sha512-klZ9Mcf/P2j+5cHMoGyIeurEzyBM2Uq9+NoSFrF6sdV5iCWHLFhrCXuhbBiQ5wVLCKf4lavlkd/DDs47PXs9RQ== dependencies: - "@react-navigation/routers" "^5.7.4" + "@react-navigation/routers" "^6.1.8" escape-string-regexp "^4.0.0" - nanoid "^3.1.15" - query-string "^6.13.6" + nanoid "^3.1.23" + query-string "^7.1.3" react-is "^16.13.0" + use-latest-callback "^0.1.5" -"@react-navigation/native-stack@5.0.4": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-5.0.4.tgz#1bf82c529390e7203d65635fc68164b2cbc4093f" - integrity sha512-i+5o0v582ZxTDrEDJcud5XI4BmzR+RAYAt592dnFgduO0lwIjch+IY5t+8PGg8n9FEN7dj+ivj1V5kx8ZggFQg== +"@react-navigation/elements@^1.3.17": + version "1.3.17" + resolved "https://registry.yarnpkg.com/@react-navigation/elements/-/elements-1.3.17.tgz#9cb95765940f2841916fc71686598c22a3e4067e" + integrity sha512-sui8AzHm6TxeEvWT/NEXlz3egYvCUog4tlXA4Xlb2Vxvy3purVXDq/XsM56lJl344U5Aj/jDzkVanOTMWyk4UA== -"@react-navigation/native@^5.8.10": - version "5.9.8" - resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.9.8.tgz#ac76ee6390ea7ce807486ca5c38d903e23433a97" - integrity sha512-DNbcDHXQPSFDLn51kkVVJjT3V7jJy2GztNYZe/2bEg29mi5QEcHHcpifjMCtyFKntAOWzKlG88UicIQ17UEghg== +"@react-navigation/native-stack@~6.9.12": + version "6.9.12" + resolved "https://registry.yarnpkg.com/@react-navigation/native-stack/-/native-stack-6.9.12.tgz#a09fe43ab2fc4c82a1809e3953021d1da4ead85c" + integrity sha512-kS2zXCWP0Rgt7uWaCUKrRl7U2U1Gp19rM1kyRY2YzBPXhWGVPjQ2ygBp88CTQzjgy8M07H/79jvGiZ0mlEJI+g== dependencies: - "@react-navigation/core" "^5.16.1" + "@react-navigation/elements" "^1.3.17" + warn-once "^0.1.0" + +"@react-navigation/native@~6.1.6": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.6.tgz#84ff5cf85b91f660470fa9407c06c8ee393d5792" + integrity sha512-14PmSy4JR8HHEk04QkxQ0ZLuqtiQfb4BV9kkMXD2/jI4TZ+yc43OnO6fQ2o9wm+Bq8pY3DxyerC2AjNUz+oH7Q== + dependencies: + "@react-navigation/core" "^6.4.8" escape-string-regexp "^4.0.0" - nanoid "^3.1.15" + fast-deep-equal "^3.1.3" + nanoid "^3.1.23" -"@react-navigation/routers@^5.7.4": - version "5.7.4" - resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.7.4.tgz#8b5460e841a0c64f6c9a5fbc2a1eb832432d4fb0" - integrity sha512-0N202XAqsU/FlE53Nmh6GHyMtGm7g6TeC93mrFAFJOqGRKznT0/ail+cYlU6tNcPA9AHzZu1Modw1eoDINSliQ== +"@react-navigation/routers@^6.1.8": + version "6.1.8" + resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-6.1.8.tgz#ae56b2678dbb5abca5bd7c95d6a8d1abc767cba2" + integrity sha512-CEge+ZLhb1HBrSvv4RwOol7EKLW1QoqVIQlE9TN5MpxS/+VoQvP+cLbuz0Op53/iJfYhtXRFd1ZAd3RTRqto9w== dependencies: - nanoid "^3.1.15" + nanoid "^3.1.23" -"@react-navigation/stack@^5.12.8": - version "5.14.9" - resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.14.9.tgz#49c7b9316e6fb456e9766c901e0d607862f0ea7d" - integrity sha512-DuvrT9P+Tz8ezZLQYxORZqOGqO+vEufaxlW1hSLw1knLD4jNxkz8TJDXtfKwaz//9gb43UhTNccNM02vm7iPqQ== +"@react-navigation/stack@~6.3.16": + version "6.3.16" + resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-6.3.16.tgz#cf94e3c8c1587455515743e91d328beef722e0ab" + integrity sha512-KTOn9cNuZ6p154Htbl2DiR95Wl+c7niLPRiGs7gjOkyVDGiaGQF9ODNQTYBDE1OxZGHe/EyYc6T2CbmiItLWDg== dependencies: - color "^3.1.3" - react-native-iphone-x-helper "^1.3.0" + "@react-navigation/elements" "^1.3.17" + color "^4.2.3" + warn-once "^0.1.0" "@sideway/address@^4.1.3": version "4.1.4" @@ -1947,7 +1958,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.3: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1971,7 +1982,7 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.6.0: +color-string@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== @@ -1979,13 +1990,13 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" + color-convert "^2.0.1" + color-string "^1.9.0" colorette@^1.0.7, colorette@^1.2.2: version "1.2.2" @@ -2158,7 +2169,7 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decode-uri-component@^0.2.0: +decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== @@ -2403,6 +2414,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + fb-watchman@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -3641,7 +3657,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nanoid@^3.1.15: +nanoid@^3.1.23: version "3.3.4" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== @@ -4065,12 +4081,12 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -query-string@^6.13.6: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== +query-string@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.3.tgz#a1cf90e994abb113a325804a972d98276fe02328" + integrity sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg== dependencies: - decode-uri-component "^0.2.0" + decode-uri-component "^0.2.2" filter-obj "^1.1.0" split-on-first "^1.0.0" strict-uri-encode "^2.0.0" @@ -4088,6 +4104,11 @@ react-devtools-core@4.24.0: shell-quote "^1.6.1" ws "^7" +react-freeze@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/react-freeze/-/react-freeze-1.0.3.tgz#5e3ca90e682fed1d73a7cb50c2c7402b3e85618d" + integrity sha512-ZnXwLQnGzrDpHBHiC56TXFXvmolPeMjTn1UOm610M4EXGzbEDR7oOIyS2ZiItgbs6eZc4oU/a0hpk8PrcKvv5g== + "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.1.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" @@ -4134,11 +4155,6 @@ react-native-gradle-plugin@^0.70.3: resolved "https://registry.yarnpkg.com/react-native-gradle-plugin/-/react-native-gradle-plugin-0.70.3.tgz#cbcf0619cbfbddaa9128701aa2d7b4145f9c4fc8" integrity sha512-oOanj84fJEXUg9FoEAQomA8ISG+DVIrTZ3qF7m69VQUJyOGYyDZmPqKcjvRku4KXlEH6hWO9i4ACLzNBh8gC0A== -react-native-iphone-x-helper@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz#20c603e9a0e765fd6f97396638bdeb0e5a60b010" - integrity sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg== - react-native-reanimated@2.12.0: version "2.12.0" resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-2.12.0.tgz#5821eecfb1769b1617a67a2d4dec12fdeedb2b6e" @@ -4157,10 +4173,13 @@ react-native-safe-area-context@^3.1.9: resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-3.4.1.tgz#c967a52903d55fe010b2428e5368b42f1debc0a7" integrity sha512-xfpVd0CiZR7oBhuwJ2HcZMehg5bjha1Ohu1XHpcT+9ykula0TgovH2BNU0R5Krzf/jBR1LMjR6VabxdlUjqxcA== -react-native-screens@^2.16.1: - version "2.18.1" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-2.18.1.tgz#47b9991c6f762d00d0ed3233e5283d523e859885" - integrity sha512-r5WZLpmx2hHjC1RgMdPq5YpSU9tEhBpUaZ5M1SUtNIONyiLqQVxabhRCINdebIk4depJiIl7yw2Q85zJyeX6fw== +react-native-screens@~3.20.0: + version "3.20.0" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.20.0.tgz#4d154177395e5541387d9a05bc2e12e54d2fb5b1" + integrity sha512-joWUKWAVHxymP3mL9gYApFHAsbd9L6ZcmpoZa6Sl3W/82bvvNVMqcfP7MeNqVCg73qZ8yL4fW+J/syusHleUgg== + dependencies: + react-freeze "^1.0.0" + warn-once "^0.1.0" react-native-svg@12.4.4: version "12.4.4" @@ -4978,6 +4997,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +use-latest-callback@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/use-latest-callback/-/use-latest-callback-0.1.5.tgz#a4a836c08fa72f6608730b5b8f4bbd9c57c04f51" + integrity sha512-HtHatS2U4/h32NlkhupDsPlrbiD27gSH5swBdtXbCAlc6pfOFzaj0FehW/FO12rx8j2Vy4/lJScCiJyM01E+bQ== + use-sync-external-store@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" @@ -5015,6 +5039,11 @@ walker@^1.0.7: dependencies: makeerror "1.0.x" +warn-once@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/warn-once/-/warn-once-0.1.1.tgz#952088f4fb56896e73fd4e6a3767272a3fccce43" + integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q== + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" diff --git a/ios/Fabric/RNCPagerViewComponentView.mm b/ios/Fabric/RNCPagerViewComponentView.mm index c636b26d..8efd1baf 100644 --- a/ios/Fabric/RNCPagerViewComponentView.mm +++ b/ios/Fabric/RNCPagerViewComponentView.mm @@ -15,7 +15,10 @@ using namespace facebook::react; -@interface RNCPagerViewComponentView () +@interface RNCPagerViewComponentView () + +@property(nonatomic, assign) UIPanGestureRecognizer* panGestureRecognizer; + @end @implementation RNCPagerViewComponentView { @@ -63,6 +66,11 @@ - (instancetype)initWithFrame:(CGRect)frame _destinationIndex = -1; _layoutDirection = @"ltr"; _overdrag = NO; + UIPanGestureRecognizer* panGestureRecognizer = [UIPanGestureRecognizer new]; + self.panGestureRecognizer = panGestureRecognizer; + panGestureRecognizer.delegate = self; + [self addGestureRecognizer: panGestureRecognizer]; + } return self; @@ -398,6 +406,29 @@ + (ComponentDescriptorProvider)componentDescriptorProvider } +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + + // Recognize simultaneously only if the other gesture is RN Screen's pan gesture (one that is used to perform fullScreenGestureEnabled) + if (gestureRecognizer == self.panGestureRecognizer && [NSStringFromClass([otherGestureRecognizer class]) isEqual: @"RNSPanGestureRecognizer"]) { + 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) { + scrollView.panGestureRecognizer.enabled = false; + } else { + const auto &viewProps = *std::static_pointer_cast(_props); + scrollView.panGestureRecognizer.enabled = viewProps.scrollEnabled; + } + + return YES; + } + const auto &viewProps = *std::static_pointer_cast(_props); + scrollView.panGestureRecognizer.enabled = viewProps.scrollEnabled; + return NO; +} + @end Class RNCViewPagerCls(void) diff --git a/ios/ReactNativePageView.m b/ios/ReactNativePageView.m index ab0fc7f3..998e70ab 100644 --- a/ios/ReactNativePageView.m +++ b/ios/ReactNativePageView.m @@ -9,7 +9,9 @@ #import "RCTOnPageSelected.h" #import -@interface ReactNativePageView () +@interface ReactNativePageView () + +@property(nonatomic, assign) UIPanGestureRecognizer* panGestureRecognizer; @property(nonatomic, strong) UIPageViewController *reactPageViewController; @property(nonatomic, strong) RCTEventDispatcher *eventDispatcher; @@ -45,6 +47,10 @@ - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher { _cachedControllers = [NSHashTable hashTableWithOptions:NSHashTableStrongMemory]; _overdrag = NO; _layoutDirection = @"ltr"; + UIPanGestureRecognizer* panGestureRecognizer = [UIPanGestureRecognizer new]; + self.panGestureRecognizer = panGestureRecognizer; + panGestureRecognizer.delegate = self; + [self addGestureRecognizer: panGestureRecognizer]; } return self; } @@ -460,6 +466,28 @@ - (NSString *)determineScrollDirection:(UIScrollView *)scrollView { return scrollDirection; } +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + + // Recognize simultaneously only if the other gesture is RN Screen's pan gesture (one that is used to perform fullScreenGestureEnabled) + if (gestureRecognizer == self.panGestureRecognizer && [NSStringFromClass([otherGestureRecognizer class]) isEqual: @"RNSPanGestureRecognizer"]) { + 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; +} + - (BOOL)isLtrLayout { return [_layoutDirection isEqualToString:@"ltr"]; }