Skip to content

Commit b1da40b

Browse files
authored
[iOS] Fix handler retrieval and mismatched coordinate space (#4199)
## Description Fixes three issues: 1. `findGestureHandlerByRecognizer` was relying on `reactTag` to determine whether a view is managed by React Native. This is no longer set on the new architecture (we do it [here](https://github.com/software-mansion/react-native-gesture-handler/blob/e362f3a1ea2c04b78d3923c377dc2c62b23ca2d0/packages/react-native-gesture-handler/apple/RNGestureHandlerManager.mm#L206), this needs to be investigated). Instead, I changed it to check whether the view is a subclass of `RCTViewComponentView` which is a base for Fabric components. 2. `shouldHandleTouch` in the button component was converting the point to the wrong coordinate space when calling `wantsToHandleEventsAtPoint`. 3. `wantsToHandleEventsAtPoint` for api v3 was always trying to get the child of the view the gesture is attached to. Correct when gesture is attached to the detector, not when directly to view (virtual detector/`wantsToAttachDirectlyToView: YES`). ## Test plan Enable "Legacy examples" in the expo app and try to scroll, starting on one of the disabled buttons. |Before|After| |-|-| |<video src="https://github.com/user-attachments/assets/28cd0b95-85df-46e8-8ca4-28c042d725b0" />|<video src="https://github.com/user-attachments/assets/7116d3aa-557f-4828-9b4e-c0177ed89202" />| There's no pointer captured, but in the "before" video, I'm trying to scroll starting on `Nested buttons (sound & ripple)`.
1 parent e362f3a commit b1da40b

2 files changed

Lines changed: 10 additions & 9 deletions

File tree

packages/react-native-gesture-handler/apple/RNGestureHandler.mm

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -640,14 +640,14 @@ + (RNGestureHandler *)findGestureHandlerByRecognizer:(UIGestureRecognizer *)reco
640640
// We may try to extract "DummyGestureHandler" in case when "otherGestureRecognizer" belongs to
641641
// a native view being wrapped with "NativeViewGestureHandler"
642642
RNGHUIView *reactView = recognizer.view;
643-
while (reactView != nil && reactView.reactTag == nil) {
644-
reactView = reactView.superview;
645-
}
646-
647-
for (UIGestureRecognizer *recognizer in reactView.gestureRecognizers) {
648-
if ([recognizer isKindOfClass:[RNDummyGestureRecognizer class]]) {
649-
return recognizer.gestureHandler;
643+
while (reactView != nil) {
644+
for (UIGestureRecognizer *recognizer in reactView.gestureRecognizers) {
645+
if ([recognizer isKindOfClass:[RNDummyGestureRecognizer class]]) {
646+
return recognizer.gestureHandler;
647+
}
650648
}
649+
650+
reactView = reactView.superview;
651651
}
652652

653653
return nil;
@@ -816,7 +816,8 @@ - (BOOL)wantsToHandleEventsAtPoint:(CGPoint)point
816816

817817
RNGHUIView *viewToHitTest = _recognizer.view;
818818

819-
if ([self usesNativeOrVirtualDetector] && [_recognizer.view.subviews count] > 0) {
819+
if ([self usesNativeOrVirtualDetector] && [_recognizer.view.subviews count] > 0 &&
820+
_recognizer.view == self.hostDetectorView) {
820821
viewToHitTest = _recognizer.view.subviews[0];
821822
point = [_recognizer.view convertPoint:point toView:viewToHitTest];
822823
}

packages/react-native-gesture-handler/apple/RNGestureHandlerButton.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,7 @@ - (BOOL)shouldHandleTouch:(RNGHUIView *)view atPoint:(CGPoint)point
850850
for (UIGestureRecognizer *recognizer in enabledGestureRecognizers) {
851851
RNGestureHandler *handler = [RNGestureHandler findGestureHandlerByRecognizer:recognizer];
852852
if (handler != nil) {
853-
CGPoint pointInView = [self convertPoint:point toView:view];
853+
CGPoint pointInView = [self convertPoint:point toView:handler.recognizer.view];
854854
gestureRecognizerWantsEvent = [handler wantsToHandleEventsAtPoint:pointInView];
855855
} else {
856856
gestureRecognizerWantsEvent = YES;

0 commit comments

Comments
 (0)