react-native-gesture-handler 2.18.1 → 2.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/android/build.gradle +11 -29
- package/android/fabric/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
- package/android/paper/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
- package/android/src/main/AndroidManifest.xml +1 -3
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +21 -21
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +1 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +16 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +80 -4
- package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +8 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +2 -1
- package/android/src/main/java/com/swmansion/gesturehandler/core/ScaleGestureDetector.java +10 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/StylusData.kt +103 -0
- package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +2 -2
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +24 -15
- package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +3 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/HoverGestureHandlerEventDataBuilder.kt +7 -0
- package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/PanGestureHandlerEventDataBuilder.kt +7 -0
- package/android/src/main/jni/CMakeLists.txt +18 -9
- package/apple/Handlers/RNFlingHandler.h +1 -0
- package/apple/Handlers/RNFlingHandler.m +153 -19
- package/apple/Handlers/RNHoverHandler.m +44 -2
- package/apple/Handlers/RNLongPressHandler.m +111 -20
- package/apple/Handlers/RNManualHandler.m +53 -29
- package/apple/Handlers/RNNativeViewHandler.mm +22 -15
- package/apple/Handlers/RNPanHandler.m +57 -7
- package/apple/Handlers/RNRotationHandler.m +1 -1
- package/apple/RNGHStylusData.h +77 -0
- package/apple/RNGHStylusData.m +37 -0
- package/apple/RNGHUIKit.h +2 -0
- package/apple/RNGHVector.h +31 -0
- package/apple/RNGHVector.m +67 -0
- package/apple/RNGestureHandler.h +7 -0
- package/apple/{RNGestureHandler.m → RNGestureHandler.mm} +63 -1
- package/apple/RNGestureHandlerButtonComponentView.mm +41 -0
- package/apple/RNGestureHandlerDirection.h +25 -0
- package/apple/RNGestureHandlerEvents.h +3 -1
- package/apple/RNGestureHandlerEvents.m +11 -3
- package/lib/commonjs/PointerType.js +2 -1
- package/lib/commonjs/PointerType.js.map +1 -1
- package/lib/commonjs/components/GestureButtons.js +5 -1
- package/lib/commonjs/components/GestureButtons.js.map +1 -1
- package/lib/commonjs/components/GestureComponents.js.map +1 -1
- package/lib/commonjs/components/Pressable/Pressable.js +66 -78
- package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
- package/lib/commonjs/components/Pressable/index.js +0 -8
- package/lib/commonjs/components/Pressable/index.js.map +1 -1
- package/lib/commonjs/components/Pressable/utils.js +1 -23
- package/lib/commonjs/components/Pressable/utils.js.map +1 -1
- package/lib/commonjs/components/ReanimatedSwipeable.js +60 -41
- package/lib/commonjs/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/commonjs/handlers/GestureHandlerEventPayload.js +4 -0
- package/lib/commonjs/handlers/LongPressGestureHandler.js +1 -1
- package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/handlers/createHandler.js +2 -1
- package/lib/commonjs/handlers/createHandler.js.map +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/utils.js +1 -1
- package/lib/commonjs/handlers/gestures/GestureDetector/utils.js.map +1 -1
- package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -1
- package/lib/commonjs/handlers/gestures/longPressGesture.js +10 -0
- package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -1
- package/lib/commonjs/jestUtils/jestUtils.js +12 -4
- package/lib/commonjs/jestUtils/jestUtils.js.map +1 -1
- package/lib/commonjs/mocks.js +16 -3
- package/lib/commonjs/mocks.js.map +1 -1
- package/lib/commonjs/utils.js +4 -0
- package/lib/commonjs/utils.js.map +1 -1
- package/lib/commonjs/web/constants.js +3 -3
- package/lib/commonjs/web/constants.js.map +1 -1
- package/lib/commonjs/web/handlers/GestureHandler.js +2 -3
- package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/HoverGestureHandler.js +18 -1
- package/lib/commonjs/web/handlers/HoverGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js +43 -9
- package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +14 -3
- package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js +12 -1
- package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/commonjs/web/interfaces.js.map +1 -1
- package/lib/commonjs/web/tools/EventManager.js.map +1 -1
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +55 -11
- package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/commonjs/web/tools/KeyboardEventManager.js +110 -0
- package/lib/commonjs/web/tools/KeyboardEventManager.js.map +1 -0
- package/lib/commonjs/web/tools/PointerEventManager.js +3 -37
- package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
- package/lib/commonjs/web/tools/Vector.js +4 -2
- package/lib/commonjs/web/tools/Vector.js.map +1 -1
- package/lib/commonjs/web/utils.js +187 -13
- package/lib/commonjs/web/utils.js.map +1 -1
- package/lib/module/PointerType.js +2 -1
- package/lib/module/PointerType.js.map +1 -1
- package/lib/module/components/GestureButtons.js +5 -1
- package/lib/module/components/GestureButtons.js.map +1 -1
- package/lib/module/components/GestureComponents.js.map +1 -1
- package/lib/module/components/Pressable/Pressable.js +67 -78
- package/lib/module/components/Pressable/Pressable.js.map +1 -1
- package/lib/module/components/Pressable/index.js +0 -1
- package/lib/module/components/Pressable/index.js.map +1 -1
- package/lib/module/components/Pressable/utils.js +1 -22
- package/lib/module/components/Pressable/utils.js.map +1 -1
- package/lib/module/components/ReanimatedSwipeable.js +58 -37
- package/lib/module/components/ReanimatedSwipeable.js.map +1 -1
- package/lib/module/handlers/GestureHandlerEventPayload.js +1 -1
- package/lib/module/handlers/LongPressGestureHandler.js +1 -1
- package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/handlers/createHandler.js +2 -1
- package/lib/module/handlers/createHandler.js.map +1 -1
- package/lib/module/handlers/gestures/GestureDetector/utils.js +2 -2
- package/lib/module/handlers/gestures/GestureDetector/utils.js.map +1 -1
- package/lib/module/handlers/gestures/gesture.js.map +1 -1
- package/lib/module/handlers/gestures/hoverGesture.js.map +1 -1
- package/lib/module/handlers/gestures/longPressGesture.js +10 -0
- package/lib/module/handlers/gestures/longPressGesture.js.map +1 -1
- package/lib/module/jestUtils/jestUtils.js +12 -4
- package/lib/module/jestUtils/jestUtils.js.map +1 -1
- package/lib/module/mocks.js +13 -3
- package/lib/module/mocks.js.map +1 -1
- package/lib/module/utils.js +1 -0
- package/lib/module/utils.js.map +1 -1
- package/lib/module/web/constants.js +1 -1
- package/lib/module/web/constants.js.map +1 -1
- package/lib/module/web/handlers/GestureHandler.js +2 -3
- package/lib/module/web/handlers/GestureHandler.js.map +1 -1
- package/lib/module/web/handlers/HoverGestureHandler.js +18 -1
- package/lib/module/web/handlers/HoverGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/LongPressGestureHandler.js +43 -9
- package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/NativeViewGestureHandler.js +14 -3
- package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
- package/lib/module/web/handlers/PanGestureHandler.js +12 -1
- package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
- package/lib/module/web/interfaces.js.map +1 -1
- package/lib/module/web/tools/EventManager.js.map +1 -1
- package/lib/module/web/tools/GestureHandlerWebDelegate.js +54 -10
- package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
- package/lib/module/web/tools/KeyboardEventManager.js +96 -0
- package/lib/module/web/tools/KeyboardEventManager.js.map +1 -0
- package/lib/module/web/tools/PointerEventManager.js +4 -38
- package/lib/module/web/tools/PointerEventManager.js.map +1 -1
- package/lib/module/web/tools/Vector.js +5 -3
- package/lib/module/web/tools/Vector.js.map +1 -1
- package/lib/module/web/utils.js +184 -13
- package/lib/module/web/utils.js.map +1 -1
- package/lib/typescript/PointerType.d.ts +2 -1
- package/lib/typescript/components/GestureComponents.d.ts +1 -1
- package/lib/typescript/components/Pressable/index.d.ts +1 -1
- package/lib/typescript/components/Pressable/utils.d.ts +3 -5
- package/lib/typescript/handlers/GestureHandlerEventPayload.d.ts +35 -0
- package/lib/typescript/handlers/LongPressGestureHandler.d.ts +5 -1
- package/lib/typescript/handlers/gestures/gesture.d.ts +2 -2
- package/lib/typescript/handlers/gestures/hoverGesture.d.ts +1 -6
- package/lib/typescript/handlers/gestures/longPressGesture.d.ts +5 -0
- package/lib/typescript/handlers/handlersRegistry.d.ts +1 -1
- package/lib/typescript/jestUtils/jestUtils.d.ts +1 -1
- package/lib/typescript/mocks.d.ts +4 -3
- package/lib/typescript/utils.d.ts +1 -0
- package/lib/typescript/web/constants.d.ts +1 -1
- package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -1
- package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +2 -0
- package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +3 -0
- package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
- package/lib/typescript/web/handlers/PanGestureHandler.d.ts +3 -1
- package/lib/typescript/web/interfaces.d.ts +9 -4
- package/lib/typescript/web/tools/EventManager.d.ts +2 -2
- package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +1 -0
- package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +6 -0
- package/lib/typescript/web/tools/KeyboardEventManager.d.ts +13 -0
- package/lib/typescript/web/utils.d.ts +2 -1
- package/package.json +3 -3
- package/src/PointerType.ts +1 -0
- package/src/components/GestureButtons.tsx +2 -1
- package/src/components/GestureComponents.tsx +1 -1
- package/src/components/Pressable/Pressable.tsx +77 -70
- package/src/components/Pressable/index.ts +1 -1
- package/src/components/Pressable/utils.ts +5 -49
- package/src/components/ReanimatedSwipeable.tsx +70 -47
- package/src/handlers/GestureHandlerEventPayload.ts +42 -0
- package/src/handlers/LongPressGestureHandler.ts +6 -0
- package/src/handlers/createHandler.tsx +1 -0
- package/src/handlers/gestures/GestureDetector/utils.ts +2 -2
- package/src/handlers/gestures/gesture.ts +3 -1
- package/src/handlers/gestures/hoverGesture.ts +1 -7
- package/src/handlers/gestures/longPressGesture.ts +9 -0
- package/src/jestUtils/jestUtils.ts +9 -1
- package/src/{mocks.ts → mocks.tsx} +8 -3
- package/src/utils.ts +2 -0
- package/src/web/constants.ts +1 -1
- package/src/web/handlers/GestureHandler.ts +4 -2
- package/src/web/handlers/HoverGestureHandler.ts +16 -2
- package/src/web/handlers/LongPressGestureHandler.ts +49 -10
- package/src/web/handlers/NativeViewGestureHandler.ts +14 -4
- package/src/web/handlers/PanGestureHandler.ts +14 -1
- package/src/web/interfaces.ts +10 -4
- package/src/web/tools/EventManager.ts +2 -4
- package/src/web/tools/GestureHandlerDelegate.ts +1 -0
- package/src/web/tools/GestureHandlerWebDelegate.ts +67 -10
- package/src/web/tools/KeyboardEventManager.ts +91 -0
- package/src/web/tools/PointerEventManager.ts +2 -38
- package/src/web/tools/Vector.ts +4 -3
- package/src/web/utils.ts +188 -13
- package/lib/commonjs/web/tools/TouchEventManager.js +0 -164
- package/lib/commonjs/web/tools/TouchEventManager.js.map +0 -1
- package/lib/module/web/tools/TouchEventManager.js +0 -149
- package/lib/module/web/tools/TouchEventManager.js.map +0 -1
- package/lib/typescript/web/tools/TouchEventManager.d.ts +0 -11
- package/src/web/tools/TouchEventManager.ts +0 -175
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
#import "RNManualHandler.h"
|
|
2
2
|
|
|
3
3
|
#if !TARGET_OS_OSX
|
|
4
|
-
|
|
5
4
|
@interface RNManualRecognizer : UIGestureRecognizer
|
|
6
|
-
|
|
5
|
+
#else
|
|
6
|
+
@interface RNManualRecognizer : NSGestureRecognizer
|
|
7
|
+
#endif
|
|
7
8
|
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
|
|
8
9
|
|
|
9
10
|
@end
|
|
@@ -19,25 +20,27 @@
|
|
|
19
20
|
_gestureHandler = gestureHandler;
|
|
20
21
|
_shouldSendBeginEvent = YES;
|
|
21
22
|
}
|
|
23
|
+
|
|
22
24
|
return self;
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
- (void)
|
|
27
|
+
- (void)interactionsBegan:(NSSet *)touches withEvent:(UIEvent *)event
|
|
26
28
|
{
|
|
27
|
-
[_gestureHandler setCurrentPointerType:event];
|
|
28
|
-
[super touchesBegan:touches withEvent:event];
|
|
29
29
|
[_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
|
|
30
30
|
|
|
31
31
|
if (_shouldSendBeginEvent) {
|
|
32
32
|
[_gestureHandler handleGesture:self];
|
|
33
|
+
#if TARGET_OS_OSX
|
|
34
|
+
self.state = NSGestureRecognizerStateBegan;
|
|
35
|
+
#endif
|
|
33
36
|
_shouldSendBeginEvent = NO;
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
|
|
37
|
-
- (void)
|
|
40
|
+
- (void)interactionsMoved:(NSSet *)touches withEvent:(UIEvent *)event
|
|
38
41
|
{
|
|
39
|
-
[super touchesMoved:touches withEvent:event];
|
|
40
42
|
[_gestureHandler.pointerTracker touchesMoved:touches withEvent:event];
|
|
43
|
+
[_gestureHandler handleGesture:self];
|
|
41
44
|
|
|
42
45
|
if ([self shouldFail]) {
|
|
43
46
|
self.state = (self.state == UIGestureRecognizerStatePossible) ? UIGestureRecognizerStateFailed
|
|
@@ -47,10 +50,31 @@
|
|
|
47
50
|
}
|
|
48
51
|
}
|
|
49
52
|
|
|
53
|
+
- (void)interactionsEnded:(NSSet *)touches withEvent:(UIEvent *)event
|
|
54
|
+
{
|
|
55
|
+
[_gestureHandler.pointerTracker touchesEnded:touches withEvent:event];
|
|
56
|
+
[_gestureHandler handleGesture:self];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#if !TARGET_OS_OSX
|
|
60
|
+
- (void)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
|
|
61
|
+
{
|
|
62
|
+
[_gestureHandler setCurrentPointerType:event];
|
|
63
|
+
[super touchesBegan:touches withEvent:event];
|
|
64
|
+
|
|
65
|
+
[self interactionsBegan:touches withEvent:event];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
- (void)touchesMoved:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
|
|
69
|
+
{
|
|
70
|
+
[super touchesMoved:touches withEvent:event];
|
|
71
|
+
[self interactionsMoved:touches withEvent:event];
|
|
72
|
+
}
|
|
73
|
+
|
|
50
74
|
- (void)touchesEnded:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
|
|
51
75
|
{
|
|
52
76
|
[super touchesEnded:touches withEvent:event];
|
|
53
|
-
[
|
|
77
|
+
[self interactionsEnded:touches withEvent:event];
|
|
54
78
|
}
|
|
55
79
|
|
|
56
80
|
- (void)touchesCancelled:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
|
|
@@ -60,6 +84,26 @@
|
|
|
60
84
|
[self reset];
|
|
61
85
|
}
|
|
62
86
|
|
|
87
|
+
#else
|
|
88
|
+
|
|
89
|
+
- (void)mouseDown:(NSEvent *)event
|
|
90
|
+
{
|
|
91
|
+
[_gestureHandler setCurrentPointerTypeToMouse];
|
|
92
|
+
[self interactionsBegan:[NSSet setWithObject:event] withEvent:event];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
- (void)mouseDragged:(NSEvent *)event
|
|
96
|
+
{
|
|
97
|
+
[self interactionsMoved:[NSSet setWithObject:event] withEvent:event];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
- (void)mouseUp:(NSEvent *)event
|
|
101
|
+
{
|
|
102
|
+
[self interactionsEnded:[NSSet setWithObject:event] withEvent:event];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
#endif
|
|
106
|
+
|
|
63
107
|
- (void)reset
|
|
64
108
|
{
|
|
65
109
|
[_gestureHandler.pointerTracker reset];
|
|
@@ -71,11 +115,7 @@
|
|
|
71
115
|
|
|
72
116
|
- (BOOL)shouldFail
|
|
73
117
|
{
|
|
74
|
-
|
|
75
|
-
return YES;
|
|
76
|
-
} else {
|
|
77
|
-
return NO;
|
|
78
|
-
}
|
|
118
|
+
return _gestureHandler.shouldCancelWhenOutside && ![_gestureHandler containsPointInView];
|
|
79
119
|
}
|
|
80
120
|
|
|
81
121
|
@end
|
|
@@ -87,24 +127,8 @@
|
|
|
87
127
|
if ((self = [super initWithTag:tag])) {
|
|
88
128
|
_recognizer = [[RNManualRecognizer alloc] initWithGestureHandler:self];
|
|
89
129
|
}
|
|
90
|
-
return self;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
@end
|
|
94
|
-
|
|
95
|
-
#else
|
|
96
|
-
|
|
97
|
-
@implementation RNManualGestureHandler
|
|
98
130
|
|
|
99
|
-
- (instancetype)initWithTag:(NSNumber *)tag
|
|
100
|
-
{
|
|
101
|
-
RCTLogWarn(@"ManualGestureHandler is not supported on macOS");
|
|
102
|
-
if ((self = [super initWithTag:tag])) {
|
|
103
|
-
_recognizer = [NSGestureRecognizer alloc];
|
|
104
|
-
}
|
|
105
131
|
return self;
|
|
106
132
|
}
|
|
107
133
|
|
|
108
134
|
@end
|
|
109
|
-
|
|
110
|
-
#endif
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
|
|
45
45
|
- (void)touchesMoved:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
|
|
46
46
|
{
|
|
47
|
+
[self updateStateIfScrollView];
|
|
47
48
|
[_gestureHandler.pointerTracker touchesMoved:touches withEvent:event];
|
|
48
49
|
}
|
|
49
50
|
|
|
@@ -51,7 +52,12 @@
|
|
|
51
52
|
{
|
|
52
53
|
[_gestureHandler.pointerTracker touchesEnded:touches withEvent:event];
|
|
53
54
|
self.state = UIGestureRecognizerStateFailed;
|
|
54
|
-
|
|
55
|
+
|
|
56
|
+
// For now, we are handling only the scroll view case.
|
|
57
|
+
// If more views need special treatment, then we can switch to a delegate pattern
|
|
58
|
+
if ([_gestureHandler retrieveScrollView:self.view] == nil) {
|
|
59
|
+
[self reset];
|
|
60
|
+
}
|
|
55
61
|
}
|
|
56
62
|
|
|
57
63
|
- (void)touchesCancelled:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
|
|
@@ -92,6 +98,19 @@
|
|
|
92
98
|
[_gestureHandler reset];
|
|
93
99
|
}
|
|
94
100
|
|
|
101
|
+
- (void)updateStateIfScrollView
|
|
102
|
+
{
|
|
103
|
+
RNGHUIScrollView *scrollView = [_gestureHandler retrieveScrollView:self.view];
|
|
104
|
+
if (!scrollView) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
for (UIGestureRecognizer *scrollViewGestureRecognizer in scrollView.gestureRecognizers) {
|
|
108
|
+
if ([_gestureHandler isUIScrollViewPanGestureRecognizer:scrollViewGestureRecognizer]) {
|
|
109
|
+
self.state = scrollViewGestureRecognizer.state;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
95
114
|
@end
|
|
96
115
|
|
|
97
116
|
#pragma mark RNNativeViewGestureHandler
|
|
@@ -141,20 +160,8 @@
|
|
|
141
160
|
// We can restore default scrollview behaviour to delay touches to scrollview's children
|
|
142
161
|
// because gesture handler system can handle cancellation of scroll recognizer when JS responder
|
|
143
162
|
// is set
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
UIScrollView *scrollView = ((RCTScrollViewComponentView *)view).scrollView;
|
|
147
|
-
scrollView.delaysContentTouches = YES;
|
|
148
|
-
}
|
|
149
|
-
#else
|
|
150
|
-
if ([view isKindOfClass:[RCTScrollView class]]) {
|
|
151
|
-
// This part of the code is coupled with RN implementation of ScrollView native wrapper and
|
|
152
|
-
// we expect for RCTScrollView component to contain a subclass of UIScrollview as the only
|
|
153
|
-
// subview
|
|
154
|
-
UIScrollView *scrollView = [view.subviews objectAtIndex:0];
|
|
155
|
-
scrollView.delaysContentTouches = YES;
|
|
156
|
-
}
|
|
157
|
-
#endif // RCT_NEW_ARCH_ENABLED
|
|
163
|
+
UIScrollView *scrollView = [self retrieveScrollView:view];
|
|
164
|
+
scrollView.delaysContentTouches = YES;
|
|
158
165
|
}
|
|
159
166
|
|
|
160
167
|
- (void)handleTouchDown:(UIView *)sender forEvent:(UIEvent *)event
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
//
|
|
8
8
|
|
|
9
9
|
#import "RNPanHandler.h"
|
|
10
|
+
#import "RNGHStylusData.h"
|
|
10
11
|
|
|
11
12
|
#if TARGET_OS_OSX
|
|
12
13
|
|
|
@@ -31,6 +32,10 @@
|
|
|
31
32
|
@property (nonatomic) CGFloat failOffsetYEnd;
|
|
32
33
|
@property (nonatomic) CGFloat activateAfterLongPress;
|
|
33
34
|
|
|
35
|
+
#if !TARGET_OS_OSX && !TARGET_OS_TV
|
|
36
|
+
@property (atomic, readonly, strong) RNGHStylusData *stylusData;
|
|
37
|
+
#endif
|
|
38
|
+
|
|
34
39
|
- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
|
|
35
40
|
|
|
36
41
|
@end
|
|
@@ -80,6 +85,28 @@
|
|
|
80
85
|
}
|
|
81
86
|
#endif
|
|
82
87
|
|
|
88
|
+
#if !TARGET_OS_OSX && !TARGET_OS_TV
|
|
89
|
+
- (void)tryUpdateStylusData:(UIEvent *)event
|
|
90
|
+
{
|
|
91
|
+
UITouch *touch = [[event allTouches] anyObject];
|
|
92
|
+
|
|
93
|
+
if (touch.type != UITouchTypePencil) {
|
|
94
|
+
return;
|
|
95
|
+
} else if (_stylusData == nil) {
|
|
96
|
+
_stylusData = [[RNGHStylusData alloc] init];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
_stylusData.altitudeAngle = touch.altitudeAngle;
|
|
100
|
+
_stylusData.azimuthAngle = [touch azimuthAngleInView:nil];
|
|
101
|
+
_stylusData.pressure = touch.force / touch.maximumPossibleForce;
|
|
102
|
+
|
|
103
|
+
CGPoint tilts = ghSpherical2tilt(_stylusData.altitudeAngle, _stylusData.azimuthAngle);
|
|
104
|
+
|
|
105
|
+
_stylusData.tiltX = tilts.x;
|
|
106
|
+
_stylusData.tiltY = tilts.y;
|
|
107
|
+
}
|
|
108
|
+
#endif
|
|
109
|
+
|
|
83
110
|
- (void)activateAfterLongPress
|
|
84
111
|
{
|
|
85
112
|
self.state = UIGestureRecognizerStateBegan;
|
|
@@ -102,6 +129,8 @@
|
|
|
102
129
|
} else {
|
|
103
130
|
super.minimumNumberOfTouches = _realMinimumNumberOfTouches;
|
|
104
131
|
}
|
|
132
|
+
|
|
133
|
+
[self tryUpdateStylusData:event];
|
|
105
134
|
#endif
|
|
106
135
|
|
|
107
136
|
#if TARGET_OS_OSX
|
|
@@ -150,17 +179,28 @@
|
|
|
150
179
|
[self setTranslation:CGPointMake(0, 0) inView:self.view];
|
|
151
180
|
}
|
|
152
181
|
}
|
|
182
|
+
|
|
183
|
+
[self tryUpdateStylusData:event];
|
|
153
184
|
#endif
|
|
154
185
|
}
|
|
155
186
|
|
|
156
187
|
- (void)interactionsEnded:(NSSet *)touches withEvent:(UIEvent *)event
|
|
157
188
|
{
|
|
158
189
|
[_gestureHandler.pointerTracker touchesEnded:touches withEvent:event];
|
|
190
|
+
|
|
191
|
+
#if !TARGET_OS_TV && !TARGET_OS_OSX
|
|
192
|
+
[self tryUpdateStylusData:event];
|
|
193
|
+
#endif
|
|
159
194
|
}
|
|
160
195
|
|
|
161
196
|
- (void)interactionsCancelled:(NSSet *)touches withEvent:(UIEvent *)event
|
|
162
197
|
{
|
|
163
198
|
[_gestureHandler.pointerTracker touchesCancelled:touches withEvent:event];
|
|
199
|
+
|
|
200
|
+
#if !TARGET_OS_TV && !TARGET_OS_OSX
|
|
201
|
+
[self tryUpdateStylusData:event];
|
|
202
|
+
#endif
|
|
203
|
+
|
|
164
204
|
[self reset];
|
|
165
205
|
}
|
|
166
206
|
|
|
@@ -224,6 +264,10 @@
|
|
|
224
264
|
self.enabled = YES;
|
|
225
265
|
[super reset];
|
|
226
266
|
[_gestureHandler reset];
|
|
267
|
+
|
|
268
|
+
#if !TARGET_OS_TV && !TARGET_OS_OSX
|
|
269
|
+
_stylusData = nil;
|
|
270
|
+
#endif
|
|
227
271
|
}
|
|
228
272
|
|
|
229
273
|
- (void)updateHasCustomActivationCriteria
|
|
@@ -405,17 +449,23 @@
|
|
|
405
449
|
withTranslation:[recognizer translationInView:recognizer.view.window.contentView]
|
|
406
450
|
withVelocity:[recognizer velocityInView:recognizer.view.window.contentView]
|
|
407
451
|
withNumberOfTouches:1
|
|
408
|
-
withPointerType:RNGestureHandlerMouse
|
|
452
|
+
withPointerType:RNGestureHandlerMouse
|
|
453
|
+
withStylusData:nil];
|
|
409
454
|
}
|
|
410
455
|
#else
|
|
411
456
|
- (RNGestureHandlerEventExtraData *)eventExtraData:(UIPanGestureRecognizer *)recognizer
|
|
412
457
|
{
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
458
|
+
RNBetterPanGestureRecognizer *panRecognizer = (RNBetterPanGestureRecognizer *)recognizer;
|
|
459
|
+
|
|
460
|
+
return [RNGestureHandlerEventExtraData
|
|
461
|
+
forPan:[recognizer locationInView:recognizer.view]
|
|
462
|
+
withAbsolutePosition:[recognizer locationInView:recognizer.view.window]
|
|
463
|
+
withTranslation:[recognizer translationInView:recognizer.view.window]
|
|
464
|
+
withVelocity:[recognizer velocityInView:recognizer.view.window]
|
|
465
|
+
withNumberOfTouches:recognizer.numberOfTouches
|
|
466
|
+
withPointerType:_pointerType
|
|
467
|
+
withStylusData:[panRecognizer.stylusData toDictionary]]; // In Objective-C calling method on nil returns
|
|
468
|
+
// nil, therefore this line does not crash.
|
|
419
469
|
}
|
|
420
470
|
#endif
|
|
421
471
|
|
|
@@ -149,7 +149,7 @@
|
|
|
149
149
|
#if TARGET_OS_OSX
|
|
150
150
|
- (RNGestureHandlerEventExtraData *)eventExtraData:(NSRotationGestureRecognizer *)recognizer
|
|
151
151
|
{
|
|
152
|
-
return [RNGestureHandlerEventExtraData forRotation
|
|
152
|
+
return [RNGestureHandlerEventExtraData forRotation:-recognizer.rotation
|
|
153
153
|
withAnchorPoint:[recognizer locationInView:recognizer.view]
|
|
154
154
|
withVelocity:((RNBetterRotationRecognizer *)recognizer).velocity
|
|
155
155
|
withNumberOfTouches:2
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNGHStylusData.h
|
|
3
|
+
// Pods
|
|
4
|
+
//
|
|
5
|
+
// Created by Michał Bert on 18/09/2024.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#ifndef RNGHStylusData_h
|
|
9
|
+
#define RNGHStylusData_h
|
|
10
|
+
|
|
11
|
+
@interface RNGHStylusData : NSObject
|
|
12
|
+
|
|
13
|
+
@property (atomic, assign) double tiltX;
|
|
14
|
+
@property (atomic, assign) double tiltY;
|
|
15
|
+
@property (atomic, assign) double altitudeAngle;
|
|
16
|
+
@property (atomic, assign) double azimuthAngle;
|
|
17
|
+
@property (atomic, assign) double pressure;
|
|
18
|
+
|
|
19
|
+
- (NSDictionary *)toDictionary;
|
|
20
|
+
|
|
21
|
+
@end
|
|
22
|
+
|
|
23
|
+
static CGPoint ghSpherical2tilt(double altitudeAngle, double azimuthAngle)
|
|
24
|
+
{
|
|
25
|
+
CGPoint tilts = {.x = 0.0, .y = 0.0};
|
|
26
|
+
|
|
27
|
+
const double radToDeg = 180 / M_PI;
|
|
28
|
+
const double eps = 0.000000001;
|
|
29
|
+
|
|
30
|
+
if (altitudeAngle < eps) {
|
|
31
|
+
// the pen is in the X-Y plane
|
|
32
|
+
if (azimuthAngle < eps || fabs(azimuthAngle - 2 * M_PI) < eps) {
|
|
33
|
+
// pen is on positive X axis
|
|
34
|
+
tilts.x = M_PI_2;
|
|
35
|
+
}
|
|
36
|
+
if (fabs(azimuthAngle - M_PI_2) < eps) {
|
|
37
|
+
// pen is on positive Y axis
|
|
38
|
+
tilts.y = M_PI_2;
|
|
39
|
+
}
|
|
40
|
+
if (fabs(azimuthAngle - M_PI) < eps) {
|
|
41
|
+
// pen is on negative X axis
|
|
42
|
+
tilts.x = -M_PI_2;
|
|
43
|
+
}
|
|
44
|
+
if (fabs(azimuthAngle - 3 * M_PI_2) < eps) {
|
|
45
|
+
// pen is on negative Y axis
|
|
46
|
+
tilts.y = -M_PI_2;
|
|
47
|
+
}
|
|
48
|
+
if (azimuthAngle > eps && fabs(azimuthAngle - M_PI_2) < eps) {
|
|
49
|
+
tilts.x = M_PI_2;
|
|
50
|
+
tilts.y = M_PI_2;
|
|
51
|
+
}
|
|
52
|
+
if (fabs(azimuthAngle - M_PI_2) > eps && fabs(azimuthAngle - M_PI) < eps) {
|
|
53
|
+
tilts.x = -M_PI_2;
|
|
54
|
+
tilts.y = M_PI_2;
|
|
55
|
+
}
|
|
56
|
+
if (azimuthAngle - M_PI > eps && fabs(azimuthAngle - 3 * M_PI_2) < eps) {
|
|
57
|
+
tilts.x = -M_PI_2;
|
|
58
|
+
tilts.y = -M_PI_2;
|
|
59
|
+
}
|
|
60
|
+
if (fabs(azimuthAngle - 3 * M_PI_2) > eps && fabs(azimuthAngle - 2 * M_PI) < eps) {
|
|
61
|
+
tilts.x = M_PI_2;
|
|
62
|
+
tilts.y = -M_PI_2;
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
const double tanAlt = tan(altitudeAngle);
|
|
66
|
+
|
|
67
|
+
tilts.x = atan(cos(azimuthAngle) / tanAlt);
|
|
68
|
+
tilts.y = atan(sin(azimuthAngle) / tanAlt);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
tilts.x = round(tilts.x * radToDeg);
|
|
72
|
+
tilts.y = round(tilts.y * radToDeg);
|
|
73
|
+
|
|
74
|
+
return tilts;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
#endif /* RNGHStylusData_h */
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNGHStylusData.m
|
|
3
|
+
// DoubleConversion
|
|
4
|
+
//
|
|
5
|
+
// Created by Michał Bert on 18/09/2024.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import "RNGHStylusData.h"
|
|
9
|
+
#import <Foundation/Foundation.h>
|
|
10
|
+
|
|
11
|
+
@implementation RNGHStylusData
|
|
12
|
+
|
|
13
|
+
- (instancetype)init
|
|
14
|
+
{
|
|
15
|
+
if (self = [super init]) {
|
|
16
|
+
self.tiltX = 0;
|
|
17
|
+
self.tiltY = 0;
|
|
18
|
+
self.altitudeAngle = M_PI_2;
|
|
19
|
+
self.azimuthAngle = 0;
|
|
20
|
+
self.pressure = 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return self;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
- (NSDictionary *)toDictionary
|
|
27
|
+
{
|
|
28
|
+
return @{
|
|
29
|
+
@"tiltX" : @(_tiltX),
|
|
30
|
+
@"tiltY" : @(_tiltY),
|
|
31
|
+
@"altitudeAngle" : @(_altitudeAngle),
|
|
32
|
+
@"azimuthAngle" : @(_azimuthAngle),
|
|
33
|
+
@"pressure" : @(_pressure),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@end
|
package/apple/RNGHUIKit.h
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
typedef UIView RNGHUIView;
|
|
6
6
|
typedef UITouch RNGHUITouch;
|
|
7
|
+
typedef UIScrollView RNGHUIScrollView;
|
|
7
8
|
|
|
8
9
|
#define RNGHGestureRecognizerStateFailed UIGestureRecognizerStateFailed;
|
|
9
10
|
#define RNGHGestureRecognizerStatePossible UIGestureRecognizerStatePossible;
|
|
@@ -17,6 +18,7 @@ typedef UITouch RNGHUITouch;
|
|
|
17
18
|
|
|
18
19
|
typedef RCTUIView RNGHUIView;
|
|
19
20
|
typedef RCTUITouch RNGHUITouch;
|
|
21
|
+
typedef NSScrollView RNGHUIScrollView;
|
|
20
22
|
|
|
21
23
|
#define RNGHGestureRecognizerStateFailed NSGestureRecognizerStateFailed;
|
|
22
24
|
#define RNGHGestureRecognizerStatePossible NSGestureRecognizerStatePossible;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNGHVector.h
|
|
3
|
+
// Pods
|
|
4
|
+
//
|
|
5
|
+
// Created by Michał Bert on 05/08/2024.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import "RNGestureHandlerDirection.h"
|
|
9
|
+
|
|
10
|
+
#ifndef RNGHVector_h
|
|
11
|
+
#define RNGHVector_h
|
|
12
|
+
|
|
13
|
+
@interface Vector : NSObject
|
|
14
|
+
|
|
15
|
+
@property (atomic, readonly, assign) double x;
|
|
16
|
+
@property (atomic, readonly, assign) double y;
|
|
17
|
+
@property (atomic, readonly, assign) double unitX;
|
|
18
|
+
@property (atomic, readonly, assign) double unitY;
|
|
19
|
+
@property (atomic, readonly, assign) double magnitude;
|
|
20
|
+
|
|
21
|
+
+ (Vector *_Nonnull)fromDirection:(RNGestureHandlerDirection)direction;
|
|
22
|
+
+ (Vector *_Nonnull)fromVelocityX:(double)vx withVelocityY:(double)vy;
|
|
23
|
+
- (nonnull instancetype)initWithX:(double)x withY:(double)y;
|
|
24
|
+
- (double)computeSimilarity:(Vector *_Nonnull)other;
|
|
25
|
+
- (BOOL)isSimilar:(Vector *_Nonnull)other withThreshold:(double)threshold;
|
|
26
|
+
|
|
27
|
+
@end
|
|
28
|
+
|
|
29
|
+
static double MINIMAL_RECOGNIZABLE_MAGNITUDE = 0.1;
|
|
30
|
+
|
|
31
|
+
#endif /* RNGHVector_h */
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNGHVector.m
|
|
3
|
+
// DoubleConversion
|
|
4
|
+
//
|
|
5
|
+
// Created by Michał Bert on 05/08/2024.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import "RNGHVector.h"
|
|
9
|
+
#import <Foundation/Foundation.h>
|
|
10
|
+
|
|
11
|
+
@implementation Vector
|
|
12
|
+
|
|
13
|
+
- (id)initWithX:(double)x withY:(double)y
|
|
14
|
+
{
|
|
15
|
+
if (self = [super init]) {
|
|
16
|
+
_x = x;
|
|
17
|
+
_y = y;
|
|
18
|
+
|
|
19
|
+
_magnitude = hypot(x, y);
|
|
20
|
+
|
|
21
|
+
_unitX = self.magnitude > MINIMAL_RECOGNIZABLE_MAGNITUDE ? x / self.magnitude : 0;
|
|
22
|
+
_unitY = self.magnitude > MINIMAL_RECOGNIZABLE_MAGNITUDE ? y / self.magnitude : 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return self;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
+ (Vector *)fromDirection:(RNGestureHandlerDirection)direction
|
|
29
|
+
{
|
|
30
|
+
switch (direction) {
|
|
31
|
+
case RNGestureHandlerDirectionRight:
|
|
32
|
+
return [[Vector alloc] initWithX:1 withY:0];
|
|
33
|
+
case RNGestureHandlerDirectionLeft:
|
|
34
|
+
return [[Vector alloc] initWithX:-1 withY:0];
|
|
35
|
+
case RNGestureHandlerDirectionUp:
|
|
36
|
+
return [[Vector alloc] initWithX:0 withY:1];
|
|
37
|
+
case RNGestureHandlerDirectionDown:
|
|
38
|
+
return [[Vector alloc] initWithX:0 withY:-1];
|
|
39
|
+
case RNGestureHandlerDirectionUpLeft:
|
|
40
|
+
return [[Vector alloc] initWithX:-1 withY:1];
|
|
41
|
+
case RNGestureHandlerDirectionUpRight:
|
|
42
|
+
return [[Vector alloc] initWithX:1 withY:1];
|
|
43
|
+
case RNGestureHandlerDirectionDownLeft:
|
|
44
|
+
return [[Vector alloc] initWithX:-1 withY:-1];
|
|
45
|
+
case RNGestureHandlerDirectionDownRight:
|
|
46
|
+
return [[Vector alloc] initWithX:1 withY:-1];
|
|
47
|
+
default:
|
|
48
|
+
return [[Vector alloc] initWithX:0 withY:0];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
+ (Vector *)fromVelocityX:(double)vx withVelocityY:(double)vy;
|
|
53
|
+
{
|
|
54
|
+
return [[Vector alloc] initWithX:vx withY:vy];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
- (double)computeSimilarity:(Vector *)other
|
|
58
|
+
{
|
|
59
|
+
return self.unitX * other.unitX + self.unitY * other.unitY;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
- (BOOL)isSimilar:(Vector *)other withThreshold:(double)threshold
|
|
63
|
+
{
|
|
64
|
+
return [self computeSimilarity:other] > threshold;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@end
|
package/apple/RNGestureHandler.h
CHANGED
|
@@ -89,6 +89,13 @@
|
|
|
89
89
|
withExtraData:(nonnull RNGestureHandlerEventExtraData *)extraData;
|
|
90
90
|
- (void)sendEvent:(nonnull RNGestureHandlerStateChange *)event;
|
|
91
91
|
- (void)sendTouchEventInState:(RNGestureHandlerState)state forViewWithTag:(nonnull NSNumber *)reactTag;
|
|
92
|
+
- (nullable RNGHUIScrollView *)retrieveScrollView:(nonnull RNGHUIView *)view;
|
|
93
|
+
|
|
94
|
+
#if !TARGET_OS_OSX
|
|
95
|
+
- (BOOL)isUIScrollViewPanGestureRecognizer:(nonnull UIGestureRecognizer *)gestureRecognizer;
|
|
96
|
+
#else
|
|
97
|
+
- (BOOL)isUIScrollViewPanGestureRecognizer:(nonnull NSGestureRecognizer *)gestureRecognizer;
|
|
98
|
+
#endif
|
|
92
99
|
|
|
93
100
|
#if !TARGET_OS_OSX
|
|
94
101
|
- (void)setCurrentPointerType:(nonnull UIEvent *)event;
|
|
@@ -5,10 +5,17 @@
|
|
|
5
5
|
|
|
6
6
|
#if !TARGET_OS_OSX
|
|
7
7
|
#import <UIKit/UIGestureRecognizerSubclass.h>
|
|
8
|
+
#import <UIKit/UIPanGestureRecognizer.h>
|
|
8
9
|
#endif
|
|
9
10
|
|
|
10
11
|
#import <React/UIView+React.h>
|
|
11
12
|
|
|
13
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
14
|
+
#import <React/RCTScrollViewComponentView.h>
|
|
15
|
+
#else
|
|
16
|
+
#import <React/RCTScrollView.h>
|
|
17
|
+
#endif
|
|
18
|
+
|
|
12
19
|
@interface UIGestureRecognizer (GestureHandler)
|
|
13
20
|
@property (nonatomic, readonly) RNGestureHandler *gestureHandler;
|
|
14
21
|
@end
|
|
@@ -205,7 +212,7 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
|
|
|
205
212
|
|
|
206
213
|
- (UITouchType)getPointerType
|
|
207
214
|
{
|
|
208
|
-
return _pointerType;
|
|
215
|
+
return (UITouchType)_pointerType;
|
|
209
216
|
}
|
|
210
217
|
|
|
211
218
|
- (void)bindToView:(RNGHUIView *)view
|
|
@@ -474,6 +481,10 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
|
|
|
474
481
|
return YES;
|
|
475
482
|
}
|
|
476
483
|
|
|
484
|
+
if ([self areScrollViewRecognizersCompatible:gestureRecognizer otherRecognizer:otherGestureRecognizer]) {
|
|
485
|
+
return YES;
|
|
486
|
+
}
|
|
487
|
+
|
|
477
488
|
RNGestureHandler *handler = [RNGestureHandler findGestureHandlerByRecognizer:otherGestureRecognizer];
|
|
478
489
|
if (handler != nil) {
|
|
479
490
|
if ([_simultaneousHandlers count]) {
|
|
@@ -495,6 +506,57 @@ static NSHashTable<RNGestureHandler *> *allGestureHandlers;
|
|
|
495
506
|
return NO;
|
|
496
507
|
}
|
|
497
508
|
|
|
509
|
+
- (BOOL)areScrollViewRecognizersCompatible:(UIGestureRecognizer *)gestureRecognizer
|
|
510
|
+
otherRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
|
|
511
|
+
{
|
|
512
|
+
if ([self isUIScrollViewPanGestureRecognizer:otherGestureRecognizer] &&
|
|
513
|
+
[gestureRecognizer isKindOfClass:[RNDummyGestureRecognizer class]]) {
|
|
514
|
+
RNGHUIScrollView *scrollView = [self retrieveScrollView:gestureRecognizer.view];
|
|
515
|
+
if (scrollView && scrollView == otherGestureRecognizer.view) {
|
|
516
|
+
return YES;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return NO;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
#if !TARGET_OS_OSX
|
|
524
|
+
// is UIPanGestureRecognizer and has scrollView property
|
|
525
|
+
- (BOOL)isUIScrollViewPanGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
|
|
526
|
+
{
|
|
527
|
+
return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] &&
|
|
528
|
+
[gestureRecognizer respondsToSelector:@selector(scrollView)];
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
#else
|
|
532
|
+
|
|
533
|
+
- (BOOL)isUIScrollViewPanGestureRecognizer:(NSGestureRecognizer *)gestureRecognizer
|
|
534
|
+
{
|
|
535
|
+
return NO;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
#endif
|
|
539
|
+
|
|
540
|
+
- (RNGHUIScrollView *)retrieveScrollView:(RNGHUIView *)view
|
|
541
|
+
{
|
|
542
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
543
|
+
if ([view isKindOfClass:[RCTScrollViewComponentView class]]) {
|
|
544
|
+
RNGHUIScrollView *scrollView = ((RCTScrollViewComponentView *)view).scrollView;
|
|
545
|
+
return scrollView;
|
|
546
|
+
}
|
|
547
|
+
#else
|
|
548
|
+
if ([view isKindOfClass:[RCTScrollView class]]) {
|
|
549
|
+
// This part of the code is coupled with RN implementation of ScrollView native wrapper and
|
|
550
|
+
// we expect for RCTScrollView component to contain a subclass of UIScrollview as the only
|
|
551
|
+
// subview
|
|
552
|
+
RNGHUIScrollView *scrollView = [view.subviews objectAtIndex:0];
|
|
553
|
+
return scrollView;
|
|
554
|
+
}
|
|
555
|
+
#endif
|
|
556
|
+
|
|
557
|
+
return nil;
|
|
558
|
+
}
|
|
559
|
+
|
|
498
560
|
- (void)reset
|
|
499
561
|
{
|
|
500
562
|
// do not reset states while gesture is tracking pointers, as gestureRecognizerShouldBegin
|