From c434589b07ba02646f41717a1413d826d52404cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Mon, 27 Apr 2026 16:22:48 +0200 Subject: [PATCH 1/2] Don't send duplicated events on iOS in Native gesture --- .../apple/Handlers/RNNativeViewHandler.mm | 24 ++++++++++++++----- .../apple/RNGestureHandler.h | 1 + .../apple/RNGestureHandler.mm | 9 +++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/react-native-gesture-handler/apple/Handlers/RNNativeViewHandler.mm b/packages/react-native-gesture-handler/apple/Handlers/RNNativeViewHandler.mm index 5e67f54326..da03a2565e 100644 --- a/packages/react-native-gesture-handler/apple/Handlers/RNNativeViewHandler.mm +++ b/packages/react-native-gesture-handler/apple/Handlers/RNNativeViewHandler.mm @@ -192,13 +192,22 @@ - (void)unbindFromView [super unbindFromView]; } +- (BOOL)shouldSuppressActiveEvent:(RNGestureHandlerEventExtraData *)extraData +{ + if (_lastActiveExtraData != nil && [_lastActiveExtraData.data isEqualToDictionary:extraData.data]) { + return YES; + } + + _lastActiveExtraData = extraData; + return NO; +} + - (void)sendActiveStateEventIfChangedForView:(UIView *)sender extraData:(RNGestureHandlerEventExtraData *)extraData { - if ([_lastActiveExtraData.data isEqualToDictionary:extraData.data]) { + if ([self shouldSuppressActiveEvent:extraData]) { return; } - _lastActiveExtraData = extraData; [self sendEventsInState:RNGestureHandlerStateActive forViewWithTag:sender.reactTag withExtraData:extraData]; } @@ -245,7 +254,6 @@ - (void)handleTouchDown:(UIView *)sender forEvent:(UIEvent *)event withNumberOfTouches:event.allTouches.count withPointerType:_pointerType]]; - _lastActiveExtraData = nil; [self sendActiveStateEventIfChangedForView:sender extraData:[RNGestureHandlerEventExtraData forPointerInside:YES withNumberOfTouches:event.allTouches.count @@ -330,7 +338,13 @@ - (BOOL)wantsToAttachDirectlyToView return YES; } -#else +- (void)reset +{ + [super reset]; + _lastActiveExtraData = nil; +} + +#endif - (RNGestureHandlerEventExtraData *)eventExtraData:(RNDummyGestureRecognizer *)recognizer { @@ -339,6 +353,4 @@ - (RNGestureHandlerEventExtraData *)eventExtraData:(RNDummyGestureRecognizer *)r withPointerType:RNGestureHandlerMouse]; } -#endif - @end diff --git a/packages/react-native-gesture-handler/apple/RNGestureHandler.h b/packages/react-native-gesture-handler/apple/RNGestureHandler.h index 8598a65fe6..b10db221de 100644 --- a/packages/react-native-gesture-handler/apple/RNGestureHandler.h +++ b/packages/react-native-gesture-handler/apple/RNGestureHandler.h @@ -96,6 +96,7 @@ - (void)setConfig:(nullable NSDictionary *)config NS_REQUIRES_SUPER; - (void)updateConfig:(nullable NSDictionary *)config NS_REQUIRES_SUPER; - (void)updateRelations:(nonnull NSDictionary *)relations; +- (BOOL)shouldSuppressActiveEvent:(RNGestureHandlerEventExtraData *)extraData; - (void)handleGesture:(nonnull id)recognizer; - (void)handleGesture:(nonnull id)recognizer fromReset:(BOOL)fromReset; - (void)handleGesture:(nonnull id)recognizer diff --git a/packages/react-native-gesture-handler/apple/RNGestureHandler.mm b/packages/react-native-gesture-handler/apple/RNGestureHandler.mm index 4987126829..8cf4bf41f3 100644 --- a/packages/react-native-gesture-handler/apple/RNGestureHandler.mm +++ b/packages/react-native-gesture-handler/apple/RNGestureHandler.mm @@ -307,6 +307,11 @@ - (RNGHUIView *)chooseViewForInteraction:(UIGestureRecognizer *)recognizer return [self isViewParagraphComponent:recognizer.view] ? recognizer.view.subviews[0] : recognizer.view; } +- (BOOL)shouldSuppressActiveEvent:(RNGestureHandlerEventExtraData *)extraData +{ + return NO; +} + - (void)handleGesture:(UIGestureRecognizer *)recognizer { [self handleGesture:recognizer fromReset:NO]; @@ -368,6 +373,10 @@ - (void)handleGesture:(UIGestureRecognizer *)recognizer RNGestureHandlerEventExtraData *eventData = [self eventExtraData:recognizer]; + if (state == RNGestureHandlerStateActive && [self shouldSuppressActiveEvent:eventData]) { + return; + } + NSNumber *tag = [self chooseViewForInteraction:recognizer].reactTag; if (tag == nil && _actionType == RNGestureHandlerActionTypeNativeDetector) { From 545a3936eab99c5dd240c537336daec8fe5d284b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 28 Apr 2026 09:47:08 +0200 Subject: [PATCH 2/2] Add nullability sepcifier --- packages/react-native-gesture-handler/apple/RNGestureHandler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-native-gesture-handler/apple/RNGestureHandler.h b/packages/react-native-gesture-handler/apple/RNGestureHandler.h index b10db221de..0b66cff5b3 100644 --- a/packages/react-native-gesture-handler/apple/RNGestureHandler.h +++ b/packages/react-native-gesture-handler/apple/RNGestureHandler.h @@ -96,7 +96,7 @@ - (void)setConfig:(nullable NSDictionary *)config NS_REQUIRES_SUPER; - (void)updateConfig:(nullable NSDictionary *)config NS_REQUIRES_SUPER; - (void)updateRelations:(nonnull NSDictionary *)relations; -- (BOOL)shouldSuppressActiveEvent:(RNGestureHandlerEventExtraData *)extraData; +- (BOOL)shouldSuppressActiveEvent:(nonnull RNGestureHandlerEventExtraData *)extraData; - (void)handleGesture:(nonnull id)recognizer; - (void)handleGesture:(nonnull id)recognizer fromReset:(BOOL)fromReset; - (void)handleGesture:(nonnull id)recognizer