react-native-gesture-handler 2.18.1 → 2.20.0

Sign up to get free protection for your applications and to get access to all the features.
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