Skip to content

Commit 74cfcd6

Browse files
authored
[iOS] Add wrapper for handleGesture:fromReset: (#3983)
## Description `Pinch` and `Rotation` are broken because they fail on [this line](https://github.com/software-mansion/react-native-gesture-handler/blob/0e74233db6a30dee547c3782aefc4f90f0551141/packages/react-native-gesture-handler/apple/RNGestureHandler.mm#L306). This happens because `handleGesture:fromReset` is called automatically via [`action` property](https://github.com/software-mansion/react-native-gesture-handler/blob/0e74233db6a30dee547c3782aefc4f90f0551141/packages/react-native-gesture-handler/apple/Handlers/RNPinchHandler.m#L36), but when UIKit calls it, it only passes `recognizer` as first parameter - `fromReset` is some garbage from memory. It gets treated as truthy value, even though it shouldn't be. Now, `handleGesture:fromRecognizer` will not be called automatically when recognizer resets its state, so it should be safe to assume that default `fromReset` value is `NO`. ## Test plan Tested on the **transformations** example and example code from #3855 on both, iOS 18.5 and iOS 26.0
1 parent 0cdf520 commit 74cfcd6

File tree

12 files changed

+32
-17
lines changed

12 files changed

+32
-17
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ @implementation RNBetterSwipeGestureRecognizer {
1616

1717
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
1818
{
19-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
19+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
2020
_gestureHandler = gestureHandler;
2121
_lastPoint = CGPointZero;
2222
_hasBegan = NO;
@@ -125,7 +125,7 @@ @implementation RNBetterSwipeGestureRecognizer {
125125

126126
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
127127
{
128-
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
128+
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
129129
_gestureHandler = gestureHandler;
130130

131131
maxDuration = 1.0;
@@ -138,9 +138,9 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
138138
return self;
139139
}
140140

141-
- (void)handleGesture:(NSPanGestureRecognizer *)gestureRecognizer fromReset:(BOOL)fromReset
141+
- (void)handleGesture:(NSPanGestureRecognizer *)gestureRecognizer
142142
{
143-
[_gestureHandler handleGesture:self fromReset:fromReset];
143+
[_gestureHandler handleGesture:self];
144144
}
145145

146146
- (void)mouseDown:(NSEvent *)event

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ @implementation RNForceTouchGestureRecognizer {
2828

2929
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
3030
{
31-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
31+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
3232
_gestureHandler = gestureHandler;
3333
_force = defaultForce;
3434
_minForce = defaultMinForce;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ @implementation RNBetterHoverGestureRecognizer {
4040

4141
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
4242
{
43-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
43+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
4444
_gestureHandler = gestureHandler;
4545
_hoverEffect = RNGestureHandlerHoverEffectNone;
4646
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
3333
- (NSUInteger)getDuration;
3434

3535
#if !TARGET_OS_OSX
36+
- (void)handleGesture:(UIGestureRecognizer *)recognizer;
3637
- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset;
3738
#else
39+
- (void)handleGesture:(NSGestureRecognizer *)recognizer;
3840
- (void)handleGesture:(NSGestureRecognizer *)recognizer fromReset:(BOOL)fromReset;
3941
#endif
4042

@@ -47,12 +49,18 @@ @implementation RNBetterLongPressGestureRecognizer {
4749

4850
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
4951
{
50-
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
52+
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
5153
_gestureHandler = gestureHandler;
5254
}
5355
return self;
5456
}
5557

58+
- (void)handleGesture:(UIGestureRecognizer *)recognizer
59+
{
60+
previousTime = CACurrentMediaTime();
61+
[_gestureHandler handleGesture:recognizer fromReset:NO];
62+
}
63+
5664
- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset
5765
{
5866
previousTime = CACurrentMediaTime();

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ @implementation RNManualRecognizer {
1616

1717
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
1818
{
19-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
19+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
2020
_gestureHandler = gestureHandler;
2121
_shouldSendBeginEvent = YES;
2222
}

packages/react-native-gesture-handler/apple/Handlers/RNNativeViewHandler.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ @implementation RNDummyGestureRecognizer {
2424

2525
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
2626
{
27-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
27+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
2828
_gestureHandler = gestureHandler;
2929
}
3030
return self;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ @implementation RNBetterPanGestureRecognizer {
5050

5151
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
5252
{
53-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
53+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
5454
_gestureHandler = gestureHandler;
5555
_minDistSq = NAN;
5656
_minVelocityX = NAN;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ @implementation RNBetterPinchRecognizer {
3333

3434
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
3535
{
36-
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
36+
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
3737
_gestureHandler = gestureHandler;
3838
}
3939
#if TARGET_OS_OSX
@@ -43,7 +43,7 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
4343
return self;
4444
}
4545

46-
- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset
46+
- (void)handleGesture:(UIGestureRecognizer *)recognizer
4747
{
4848
if (self.state == UIGestureRecognizerStateBegan) {
4949
#if TARGET_OS_OSX
@@ -52,7 +52,8 @@ - (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromRese
5252
self.scale = 1;
5353
#endif
5454
}
55-
[_gestureHandler handleGesture:recognizer fromReset:fromReset];
55+
56+
[_gestureHandler handleGesture:recognizer fromReset:NO];
5657
}
5758

5859
- (void)interactionsBegan:(NSSet *)touches withEvent:(UIEvent *)event

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ @implementation RNBetterRotationRecognizer {
3131

3232
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
3333
{
34-
if ((self = [super initWithTarget:self action:@selector(handleGesture:fromReset:)])) {
34+
if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
3535
_gestureHandler = gestureHandler;
3636
}
3737
#if TARGET_OS_OSX
@@ -41,12 +41,12 @@ - (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
4141
return self;
4242
}
4343

44-
- (void)handleGesture:(UIGestureRecognizer *)recognizer fromReset:(BOOL)fromReset
44+
- (void)handleGesture:(UIGestureRecognizer *)recognizer
4545
{
4646
if (self.state == UIGestureRecognizerStateBegan) {
4747
self.rotation = 0;
4848
}
49-
[_gestureHandler handleGesture:recognizer fromReset:fromReset];
49+
[_gestureHandler handleGesture:recognizer fromReset:NO];
5050
}
5151

5252
- (void)interactionsBegan:(NSSet *)touches withEvent:(UIEvent *)event

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ @implementation RNBetterTapGestureRecognizer {
4747

4848
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
4949
{
50-
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:fromReset:)])) {
50+
if ((self = [super initWithTarget:gestureHandler action:@selector(handleGesture:)])) {
5151
_gestureHandler = gestureHandler;
5252
_tapsSoFar = 0;
5353
_numberOfTaps = defaultNumberOfTaps;

0 commit comments

Comments
 (0)