Skip to content

Commit 3456c0a

Browse files
authored
[iOS] Fix enabled state diverging between the handler and its recognizer (#4140)
## Description Since some recognizers changed their own state in `reset`, it was possible for the value to desync between the recognizer and the handler. This could lead to issues where a "disabled" handler would block other gestures from firing. This PR: - removes explicit `enabled = YES` from pan gesture, since it never changes the value by itself - replaces `enabled = YES` with `enabled = _gestureHandler.enabled` for tap, since it can set its own `enabled` to `NO` to cancel itself - removes `shouldBeRequiredToFailByGestureRecognizer` from the root recognizer - it was added in de0ffb4, before aligning `enabled` between recognizer and handler in a64b425. Disabled recognizers should never be considered for recognition, so this is effectively a no-op. ## Test plan Tested on the provided repro: https://github.com/pawicao/rngh-v3-testing/blob/enabled-repro/src/app/index.tsx Zoom in, pan around, zoom out, try to scroll horizontally
1 parent 86bbf16 commit 3456c0a

3 files changed

Lines changed: 1 addition & 14 deletions

File tree

packages/react-native-gesture-handler/apple/Handlers/RNPanHandler.m

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,6 @@ - (void)reset
269269
[self triggerActionFromReset];
270270
[_gestureHandler.pointerTracker reset];
271271
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(activateAfterLongPress) object:nil];
272-
self.enabled = YES;
273272
[super reset];
274273
[_gestureHandler reset];
275274

packages/react-native-gesture-handler/apple/Handlers/RNTapHandler.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ - (void)reset
258258
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(cancel) object:nil];
259259
_tapsSoFar = 0;
260260
_maxNumberOfTouches = 0;
261-
self.enabled = YES;
261+
self.enabled = _gestureHandler.enabled;
262262
[super reset];
263263
[_gestureHandler reset];
264264
}

packages/react-native-gesture-handler/apple/RNRootViewGestureRecognizer.m

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,6 @@ - (instancetype)init
3333
return self;
3434
}
3535

36-
- (BOOL)shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
37-
{
38-
// This method is used to implement "enabled" feature for gesture handlers. We enforce gesture
39-
// recognizers that are connected with "disabled" handlers to wait for the root gesture
40-
// recognizer to fail and this way we block them from acting.
41-
RNGestureHandler *otherHandler = [RNGestureHandler findGestureHandlerByRecognizer:otherGestureRecognizer];
42-
if (otherHandler != nil && otherHandler.enabled == NO) {
43-
return YES;
44-
}
45-
return NO;
46-
}
47-
4836
- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer
4937
{
5038
return ![preventedGestureRecognizer isKindOfClass:[RCTSurfaceTouchHandler class]];

0 commit comments

Comments
 (0)