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.
Files changed (210) hide show
  1. package/README.md +1 -0
  2. package/android/build.gradle +11 -29
  3. package/android/fabric/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
  4. package/android/paper/src/main/java/com/swmansion/gesturehandler/ReactContextExtensions.kt +1 -1
  5. package/android/src/main/AndroidManifest.xml +1 -3
  6. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandler.kt +21 -21
  7. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureHandlerOrchestrator.kt +2 -2
  8. package/android/src/main/java/com/swmansion/gesturehandler/core/GestureUtils.kt +1 -0
  9. package/android/src/main/java/com/swmansion/gesturehandler/core/HoverGestureHandler.kt +16 -0
  10. package/android/src/main/java/com/swmansion/gesturehandler/core/LongPressGestureHandler.kt +80 -4
  11. package/android/src/main/java/com/swmansion/gesturehandler/core/PanGestureHandler.kt +8 -0
  12. package/android/src/main/java/com/swmansion/gesturehandler/core/PinchGestureHandler.kt +2 -1
  13. package/android/src/main/java/com/swmansion/gesturehandler/core/ScaleGestureDetector.java +10 -0
  14. package/android/src/main/java/com/swmansion/gesturehandler/core/StylusData.kt +103 -0
  15. package/android/src/main/java/com/swmansion/gesturehandler/core/Vector.kt +2 -2
  16. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt +24 -15
  17. package/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerModule.kt +3 -0
  18. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/HoverGestureHandlerEventDataBuilder.kt +7 -0
  19. package/android/src/main/java/com/swmansion/gesturehandler/react/eventbuilders/PanGestureHandlerEventDataBuilder.kt +7 -0
  20. package/android/src/main/jni/CMakeLists.txt +18 -9
  21. package/apple/Handlers/RNFlingHandler.h +1 -0
  22. package/apple/Handlers/RNFlingHandler.m +153 -19
  23. package/apple/Handlers/RNHoverHandler.m +44 -2
  24. package/apple/Handlers/RNLongPressHandler.m +111 -20
  25. package/apple/Handlers/RNManualHandler.m +53 -29
  26. package/apple/Handlers/RNNativeViewHandler.mm +22 -15
  27. package/apple/Handlers/RNPanHandler.m +57 -7
  28. package/apple/Handlers/RNRotationHandler.m +1 -1
  29. package/apple/RNGHStylusData.h +77 -0
  30. package/apple/RNGHStylusData.m +37 -0
  31. package/apple/RNGHUIKit.h +2 -0
  32. package/apple/RNGHVector.h +31 -0
  33. package/apple/RNGHVector.m +67 -0
  34. package/apple/RNGestureHandler.h +7 -0
  35. package/apple/{RNGestureHandler.m → RNGestureHandler.mm} +63 -1
  36. package/apple/RNGestureHandlerButtonComponentView.mm +41 -0
  37. package/apple/RNGestureHandlerDirection.h +25 -0
  38. package/apple/RNGestureHandlerEvents.h +3 -1
  39. package/apple/RNGestureHandlerEvents.m +11 -3
  40. package/lib/commonjs/PointerType.js +2 -1
  41. package/lib/commonjs/PointerType.js.map +1 -1
  42. package/lib/commonjs/components/GestureButtons.js +5 -1
  43. package/lib/commonjs/components/GestureButtons.js.map +1 -1
  44. package/lib/commonjs/components/GestureComponents.js.map +1 -1
  45. package/lib/commonjs/components/Pressable/Pressable.js +66 -78
  46. package/lib/commonjs/components/Pressable/Pressable.js.map +1 -1
  47. package/lib/commonjs/components/Pressable/index.js +0 -8
  48. package/lib/commonjs/components/Pressable/index.js.map +1 -1
  49. package/lib/commonjs/components/Pressable/utils.js +1 -23
  50. package/lib/commonjs/components/Pressable/utils.js.map +1 -1
  51. package/lib/commonjs/components/ReanimatedSwipeable.js +60 -41
  52. package/lib/commonjs/components/ReanimatedSwipeable.js.map +1 -1
  53. package/lib/commonjs/handlers/GestureHandlerEventPayload.js +4 -0
  54. package/lib/commonjs/handlers/LongPressGestureHandler.js +1 -1
  55. package/lib/commonjs/handlers/LongPressGestureHandler.js.map +1 -1
  56. package/lib/commonjs/handlers/createHandler.js +2 -1
  57. package/lib/commonjs/handlers/createHandler.js.map +1 -1
  58. package/lib/commonjs/handlers/gestures/GestureDetector/utils.js +1 -1
  59. package/lib/commonjs/handlers/gestures/GestureDetector/utils.js.map +1 -1
  60. package/lib/commonjs/handlers/gestures/gesture.js.map +1 -1
  61. package/lib/commonjs/handlers/gestures/hoverGesture.js.map +1 -1
  62. package/lib/commonjs/handlers/gestures/longPressGesture.js +10 -0
  63. package/lib/commonjs/handlers/gestures/longPressGesture.js.map +1 -1
  64. package/lib/commonjs/jestUtils/jestUtils.js +12 -4
  65. package/lib/commonjs/jestUtils/jestUtils.js.map +1 -1
  66. package/lib/commonjs/mocks.js +16 -3
  67. package/lib/commonjs/mocks.js.map +1 -1
  68. package/lib/commonjs/utils.js +4 -0
  69. package/lib/commonjs/utils.js.map +1 -1
  70. package/lib/commonjs/web/constants.js +3 -3
  71. package/lib/commonjs/web/constants.js.map +1 -1
  72. package/lib/commonjs/web/handlers/GestureHandler.js +2 -3
  73. package/lib/commonjs/web/handlers/GestureHandler.js.map +1 -1
  74. package/lib/commonjs/web/handlers/HoverGestureHandler.js +18 -1
  75. package/lib/commonjs/web/handlers/HoverGestureHandler.js.map +1 -1
  76. package/lib/commonjs/web/handlers/LongPressGestureHandler.js +43 -9
  77. package/lib/commonjs/web/handlers/LongPressGestureHandler.js.map +1 -1
  78. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js +14 -3
  79. package/lib/commonjs/web/handlers/NativeViewGestureHandler.js.map +1 -1
  80. package/lib/commonjs/web/handlers/PanGestureHandler.js +12 -1
  81. package/lib/commonjs/web/handlers/PanGestureHandler.js.map +1 -1
  82. package/lib/commonjs/web/interfaces.js.map +1 -1
  83. package/lib/commonjs/web/tools/EventManager.js.map +1 -1
  84. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js +55 -11
  85. package/lib/commonjs/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  86. package/lib/commonjs/web/tools/KeyboardEventManager.js +110 -0
  87. package/lib/commonjs/web/tools/KeyboardEventManager.js.map +1 -0
  88. package/lib/commonjs/web/tools/PointerEventManager.js +3 -37
  89. package/lib/commonjs/web/tools/PointerEventManager.js.map +1 -1
  90. package/lib/commonjs/web/tools/Vector.js +4 -2
  91. package/lib/commonjs/web/tools/Vector.js.map +1 -1
  92. package/lib/commonjs/web/utils.js +187 -13
  93. package/lib/commonjs/web/utils.js.map +1 -1
  94. package/lib/module/PointerType.js +2 -1
  95. package/lib/module/PointerType.js.map +1 -1
  96. package/lib/module/components/GestureButtons.js +5 -1
  97. package/lib/module/components/GestureButtons.js.map +1 -1
  98. package/lib/module/components/GestureComponents.js.map +1 -1
  99. package/lib/module/components/Pressable/Pressable.js +67 -78
  100. package/lib/module/components/Pressable/Pressable.js.map +1 -1
  101. package/lib/module/components/Pressable/index.js +0 -1
  102. package/lib/module/components/Pressable/index.js.map +1 -1
  103. package/lib/module/components/Pressable/utils.js +1 -22
  104. package/lib/module/components/Pressable/utils.js.map +1 -1
  105. package/lib/module/components/ReanimatedSwipeable.js +58 -37
  106. package/lib/module/components/ReanimatedSwipeable.js.map +1 -1
  107. package/lib/module/handlers/GestureHandlerEventPayload.js +1 -1
  108. package/lib/module/handlers/LongPressGestureHandler.js +1 -1
  109. package/lib/module/handlers/LongPressGestureHandler.js.map +1 -1
  110. package/lib/module/handlers/createHandler.js +2 -1
  111. package/lib/module/handlers/createHandler.js.map +1 -1
  112. package/lib/module/handlers/gestures/GestureDetector/utils.js +2 -2
  113. package/lib/module/handlers/gestures/GestureDetector/utils.js.map +1 -1
  114. package/lib/module/handlers/gestures/gesture.js.map +1 -1
  115. package/lib/module/handlers/gestures/hoverGesture.js.map +1 -1
  116. package/lib/module/handlers/gestures/longPressGesture.js +10 -0
  117. package/lib/module/handlers/gestures/longPressGesture.js.map +1 -1
  118. package/lib/module/jestUtils/jestUtils.js +12 -4
  119. package/lib/module/jestUtils/jestUtils.js.map +1 -1
  120. package/lib/module/mocks.js +13 -3
  121. package/lib/module/mocks.js.map +1 -1
  122. package/lib/module/utils.js +1 -0
  123. package/lib/module/utils.js.map +1 -1
  124. package/lib/module/web/constants.js +1 -1
  125. package/lib/module/web/constants.js.map +1 -1
  126. package/lib/module/web/handlers/GestureHandler.js +2 -3
  127. package/lib/module/web/handlers/GestureHandler.js.map +1 -1
  128. package/lib/module/web/handlers/HoverGestureHandler.js +18 -1
  129. package/lib/module/web/handlers/HoverGestureHandler.js.map +1 -1
  130. package/lib/module/web/handlers/LongPressGestureHandler.js +43 -9
  131. package/lib/module/web/handlers/LongPressGestureHandler.js.map +1 -1
  132. package/lib/module/web/handlers/NativeViewGestureHandler.js +14 -3
  133. package/lib/module/web/handlers/NativeViewGestureHandler.js.map +1 -1
  134. package/lib/module/web/handlers/PanGestureHandler.js +12 -1
  135. package/lib/module/web/handlers/PanGestureHandler.js.map +1 -1
  136. package/lib/module/web/interfaces.js.map +1 -1
  137. package/lib/module/web/tools/EventManager.js.map +1 -1
  138. package/lib/module/web/tools/GestureHandlerWebDelegate.js +54 -10
  139. package/lib/module/web/tools/GestureHandlerWebDelegate.js.map +1 -1
  140. package/lib/module/web/tools/KeyboardEventManager.js +96 -0
  141. package/lib/module/web/tools/KeyboardEventManager.js.map +1 -0
  142. package/lib/module/web/tools/PointerEventManager.js +4 -38
  143. package/lib/module/web/tools/PointerEventManager.js.map +1 -1
  144. package/lib/module/web/tools/Vector.js +5 -3
  145. package/lib/module/web/tools/Vector.js.map +1 -1
  146. package/lib/module/web/utils.js +184 -13
  147. package/lib/module/web/utils.js.map +1 -1
  148. package/lib/typescript/PointerType.d.ts +2 -1
  149. package/lib/typescript/components/GestureComponents.d.ts +1 -1
  150. package/lib/typescript/components/Pressable/index.d.ts +1 -1
  151. package/lib/typescript/components/Pressable/utils.d.ts +3 -5
  152. package/lib/typescript/handlers/GestureHandlerEventPayload.d.ts +35 -0
  153. package/lib/typescript/handlers/LongPressGestureHandler.d.ts +5 -1
  154. package/lib/typescript/handlers/gestures/gesture.d.ts +2 -2
  155. package/lib/typescript/handlers/gestures/hoverGesture.d.ts +1 -6
  156. package/lib/typescript/handlers/gestures/longPressGesture.d.ts +5 -0
  157. package/lib/typescript/handlers/handlersRegistry.d.ts +1 -1
  158. package/lib/typescript/jestUtils/jestUtils.d.ts +1 -1
  159. package/lib/typescript/mocks.d.ts +4 -3
  160. package/lib/typescript/utils.d.ts +1 -0
  161. package/lib/typescript/web/constants.d.ts +1 -1
  162. package/lib/typescript/web/handlers/GestureHandler.d.ts +1 -1
  163. package/lib/typescript/web/handlers/HoverGestureHandler.d.ts +2 -0
  164. package/lib/typescript/web/handlers/LongPressGestureHandler.d.ts +3 -0
  165. package/lib/typescript/web/handlers/NativeViewGestureHandler.d.ts +1 -0
  166. package/lib/typescript/web/handlers/PanGestureHandler.d.ts +3 -1
  167. package/lib/typescript/web/interfaces.d.ts +9 -4
  168. package/lib/typescript/web/tools/EventManager.d.ts +2 -2
  169. package/lib/typescript/web/tools/GestureHandlerDelegate.d.ts +1 -0
  170. package/lib/typescript/web/tools/GestureHandlerWebDelegate.d.ts +6 -0
  171. package/lib/typescript/web/tools/KeyboardEventManager.d.ts +13 -0
  172. package/lib/typescript/web/utils.d.ts +2 -1
  173. package/package.json +3 -3
  174. package/src/PointerType.ts +1 -0
  175. package/src/components/GestureButtons.tsx +2 -1
  176. package/src/components/GestureComponents.tsx +1 -1
  177. package/src/components/Pressable/Pressable.tsx +77 -70
  178. package/src/components/Pressable/index.ts +1 -1
  179. package/src/components/Pressable/utils.ts +5 -49
  180. package/src/components/ReanimatedSwipeable.tsx +70 -47
  181. package/src/handlers/GestureHandlerEventPayload.ts +42 -0
  182. package/src/handlers/LongPressGestureHandler.ts +6 -0
  183. package/src/handlers/createHandler.tsx +1 -0
  184. package/src/handlers/gestures/GestureDetector/utils.ts +2 -2
  185. package/src/handlers/gestures/gesture.ts +3 -1
  186. package/src/handlers/gestures/hoverGesture.ts +1 -7
  187. package/src/handlers/gestures/longPressGesture.ts +9 -0
  188. package/src/jestUtils/jestUtils.ts +9 -1
  189. package/src/{mocks.ts → mocks.tsx} +8 -3
  190. package/src/utils.ts +2 -0
  191. package/src/web/constants.ts +1 -1
  192. package/src/web/handlers/GestureHandler.ts +4 -2
  193. package/src/web/handlers/HoverGestureHandler.ts +16 -2
  194. package/src/web/handlers/LongPressGestureHandler.ts +49 -10
  195. package/src/web/handlers/NativeViewGestureHandler.ts +14 -4
  196. package/src/web/handlers/PanGestureHandler.ts +14 -1
  197. package/src/web/interfaces.ts +10 -4
  198. package/src/web/tools/EventManager.ts +2 -4
  199. package/src/web/tools/GestureHandlerDelegate.ts +1 -0
  200. package/src/web/tools/GestureHandlerWebDelegate.ts +67 -10
  201. package/src/web/tools/KeyboardEventManager.ts +91 -0
  202. package/src/web/tools/PointerEventManager.ts +2 -38
  203. package/src/web/tools/Vector.ts +4 -3
  204. package/src/web/utils.ts +188 -13
  205. package/lib/commonjs/web/tools/TouchEventManager.js +0 -164
  206. package/lib/commonjs/web/tools/TouchEventManager.js.map +0 -1
  207. package/lib/module/web/tools/TouchEventManager.js +0 -149
  208. package/lib/module/web/tools/TouchEventManager.js.map +0 -1
  209. package/lib/typescript/web/tools/TouchEventManager.d.ts +0 -11
  210. 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)touchesBegan:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
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)touchesMoved:(NSSet<RNGHUITouch *> *)touches withEvent:(UIEvent *)event
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
- [_gestureHandler.pointerTracker touchesEnded:touches withEvent:event];
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
- if (_gestureHandler.shouldCancelWhenOutside && ![_gestureHandler containsPointInView]) {
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
- [self reset];
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
- #ifdef RCT_NEW_ARCH_ENABLED
145
- if ([view isKindOfClass:[RCTScrollViewComponentView class]]) {
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
- return [RNGestureHandlerEventExtraData forPan:[recognizer locationInView:recognizer.view]
414
- withAbsolutePosition:[recognizer locationInView:recognizer.view.window]
415
- withTranslation:[recognizer translationInView:recognizer.view.window]
416
- withVelocity:[recognizer velocityInView:recognizer.view.window]
417
- withNumberOfTouches:recognizer.numberOfTouches
418
- withPointerType:_pointerType];
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:recognizer.rotation
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
@@ -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