diff --git a/ios/RNGestureHandlerManager.mm b/ios/RNGestureHandlerManager.mm index ef39a2eb65..8440e63a3e 100644 --- a/ios/RNGestureHandlerManager.mm +++ b/ios/RNGestureHandlerManager.mm @@ -3,6 +3,7 @@ #import #import #import +#import #import #import #import @@ -15,6 +16,7 @@ #import "RNRootViewGestureRecognizer.h" #ifdef RCT_NEW_ARCH_ENABLED +#import #import #import #import @@ -199,15 +201,26 @@ - (void)registerViewWithGestureRecognizerAttachedIfNeeded:(UIView *)childView #ifdef RCT_NEW_ARCH_ENABLED UIView *touchHandlerView = childView; - while (touchHandlerView != nil && ![touchHandlerView isKindOfClass:[RCTSurfaceView class]]) { - touchHandlerView = touchHandlerView.superview; + if ([[childView reactViewController] isKindOfClass:[RCTFabricModalHostViewController class]]) { + touchHandlerView = [childView reactViewController].view; + } else { + while (touchHandlerView != nil && ![touchHandlerView isKindOfClass:[RCTSurfaceView class]]) { + touchHandlerView = touchHandlerView.superview; + } } #else - UIView *parent = childView; - while (parent != nil && ![parent respondsToSelector:@selector(touchHandler)]) - parent = parent.superview; + UIView *touchHandlerView = nil; + + if ([[childView reactViewController] isKindOfClass:[RCTModalHostViewController class]]) { + touchHandlerView = [childView reactViewController].view.subviews[0]; + } else { + UIView *parent = childView; + while (parent != nil && ![parent respondsToSelector:@selector(touchHandler)]) { + parent = parent.superview; + } - UIView *touchHandlerView = [[parent performSelector:@selector(touchHandler)] view]; + touchHandlerView = [[parent performSelector:@selector(touchHandler)] view]; + } #endif // RCT_NEW_ARCH_ENABLED if (touchHandlerView == nil) { @@ -247,20 +260,19 @@ - (void)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer if ([gestureRecognizer.view isKindOfClass:[UIScrollView class]]) return; -#ifdef RCT_NEW_ARCH_ENABLED UIGestureRecognizer *touchHandler = nil; - // touchHandler (RCTSurfaceTouchHandler) is private in RCTFabricSurface so we have to do - // this little trick to get access to it + // this way we can extract the touch handler on both architectures relatively easily for (UIGestureRecognizer *recognizer in [viewWithTouchHandler gestureRecognizers]) { +#ifdef RCT_NEW_ARCH_ENABLED if ([recognizer isKindOfClass:[RCTSurfaceTouchHandler class]]) { +#else + if ([recognizer isKindOfClass:[RCTTouchHandler class]]) { +#endif // RCT_NEW_ARCH_ENABLED touchHandler = recognizer; break; } } -#else - RCTTouchHandler *touchHandler = [viewWithTouchHandler performSelector:@selector(touchHandler)]; -#endif // RCT_NEW_ARCH_ENABLED [touchHandler setEnabled:NO]; [touchHandler setEnabled:YES]; }