From 3cd717ed8503ef15e65f564d55e3e35316903092 Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 27 May 2026 12:09:10 +0200 Subject: [PATCH 1/2] Fix retrieval and mismatched coordinate space --- .../react-native-gesture-handler/apple/RNGestureHandler.mm | 5 +++-- .../apple/RNGestureHandlerButton.mm | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/react-native-gesture-handler/apple/RNGestureHandler.mm b/packages/react-native-gesture-handler/apple/RNGestureHandler.mm index fc4452ab3a..dcb2100a89 100644 --- a/packages/react-native-gesture-handler/apple/RNGestureHandler.mm +++ b/packages/react-native-gesture-handler/apple/RNGestureHandler.mm @@ -640,7 +640,7 @@ + (RNGestureHandler *)findGestureHandlerByRecognizer:(UIGestureRecognizer *)reco // We may try to extract "DummyGestureHandler" in case when "otherGestureRecognizer" belongs to // a native view being wrapped with "NativeViewGestureHandler" RNGHUIView *reactView = recognizer.view; - while (reactView != nil && reactView.reactTag == nil) { + while (reactView != nil && ![reactView isKindOfClass:[RCTViewComponentView class]]) { reactView = reactView.superview; } @@ -816,7 +816,8 @@ - (BOOL)wantsToHandleEventsAtPoint:(CGPoint)point RNGHUIView *viewToHitTest = _recognizer.view; - if ([self usesNativeOrVirtualDetector] && [_recognizer.view.subviews count] > 0) { + if ([self usesNativeOrVirtualDetector] && [_recognizer.view.subviews count] > 0 && + _recognizer.view == self.hostDetectorView) { viewToHitTest = _recognizer.view.subviews[0]; point = [_recognizer.view convertPoint:point toView:viewToHitTest]; } diff --git a/packages/react-native-gesture-handler/apple/RNGestureHandlerButton.mm b/packages/react-native-gesture-handler/apple/RNGestureHandlerButton.mm index f4f1b5b0d2..77e0cd1e8f 100644 --- a/packages/react-native-gesture-handler/apple/RNGestureHandlerButton.mm +++ b/packages/react-native-gesture-handler/apple/RNGestureHandlerButton.mm @@ -850,7 +850,7 @@ - (BOOL)shouldHandleTouch:(RNGHUIView *)view atPoint:(CGPoint)point for (UIGestureRecognizer *recognizer in enabledGestureRecognizers) { RNGestureHandler *handler = [RNGestureHandler findGestureHandlerByRecognizer:recognizer]; if (handler != nil) { - CGPoint pointInView = [self convertPoint:point toView:view]; + CGPoint pointInView = [self convertPoint:point toView:handler.recognizer.view]; gestureRecognizerWantsEvent = [handler wantsToHandleEventsAtPoint:pointInView]; } else { gestureRecognizerWantsEvent = YES; From 67100ac19775c6bdec86044b5c2e6b3e2721aecc Mon Sep 17 00:00:00 2001 From: Jakub Piasecki Date: Wed, 27 May 2026 12:30:11 +0200 Subject: [PATCH 2/2] Don't rely on heuristics --- .../apple/RNGestureHandler.mm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/react-native-gesture-handler/apple/RNGestureHandler.mm b/packages/react-native-gesture-handler/apple/RNGestureHandler.mm index dcb2100a89..3d26f798e8 100644 --- a/packages/react-native-gesture-handler/apple/RNGestureHandler.mm +++ b/packages/react-native-gesture-handler/apple/RNGestureHandler.mm @@ -640,14 +640,14 @@ + (RNGestureHandler *)findGestureHandlerByRecognizer:(UIGestureRecognizer *)reco // We may try to extract "DummyGestureHandler" in case when "otherGestureRecognizer" belongs to // a native view being wrapped with "NativeViewGestureHandler" RNGHUIView *reactView = recognizer.view; - while (reactView != nil && ![reactView isKindOfClass:[RCTViewComponentView class]]) { - reactView = reactView.superview; - } - - for (UIGestureRecognizer *recognizer in reactView.gestureRecognizers) { - if ([recognizer isKindOfClass:[RNDummyGestureRecognizer class]]) { - return recognizer.gestureHandler; + while (reactView != nil) { + for (UIGestureRecognizer *recognizer in reactView.gestureRecognizers) { + if ([recognizer isKindOfClass:[RNDummyGestureRecognizer class]]) { + return recognizer.gestureHandler; + } } + + reactView = reactView.superview; } return nil;