react-native-gesture-handler 2.20.0 → 2.20.2
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/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/apple/Handlers/RNPanHandler.m +5 -1
- package/apple/RNGestureHandlerButton.h +17 -1
- package/apple/{RNGestureHandlerButton.m → RNGestureHandlerButton.mm} +64 -0
- package/apple/RNGestureHandlerButtonComponentView.h +4 -0
- package/apple/RNGestureHandlerButtonComponentView.mm +12 -3
- package/apple/{RNGestureHandlerButtonManager.m → RNGestureHandlerButtonManager.mm} +1 -1
- package/package.json +1 -1
@@ -8,5 +8,5 @@ import com.facebook.react.uimanager.events.Event
|
|
8
8
|
|
9
9
|
fun ReactContext.dispatchEvent(event: Event<*>) {
|
10
10
|
val fabricUIManager = UIManagerHelper.getUIManager(this, UIManagerType.FABRIC) as FabricUIManager
|
11
|
-
fabricUIManager.
|
11
|
+
fabricUIManager.eventDispatcher.dispatchEvent(event)
|
12
12
|
}
|
@@ -6,7 +6,7 @@ import com.facebook.react.uimanager.events.Event
|
|
6
6
|
|
7
7
|
fun ReactContext.dispatchEvent(event: Event<*>) {
|
8
8
|
try {
|
9
|
-
this.getNativeModule(UIManagerModule::class.java)!!.
|
9
|
+
this.getNativeModule(UIManagerModule::class.java)!!.eventDispatcher.dispatchEvent(event)
|
10
10
|
} catch (e: NullPointerException) {
|
11
11
|
throw Exception("Couldn't get an instance of UIManagerModule. Gesture Handler is unable to send an event.", e)
|
12
12
|
}
|
@@ -464,9 +464,13 @@
|
|
464
464
|
withVelocity:[recognizer velocityInView:recognizer.view.window]
|
465
465
|
withNumberOfTouches:recognizer.numberOfTouches
|
466
466
|
withPointerType:_pointerType
|
467
|
+
#if !TARGET_OS_TV
|
467
468
|
withStylusData:[panRecognizer.stylusData toDictionary]]; // In Objective-C calling method on nil returns
|
468
469
|
// nil, therefore this line does not crash.
|
470
|
+
#else
|
471
|
+
withStylusData:nil];
|
472
|
+
#endif // TARGET_OS_TV
|
469
473
|
}
|
470
|
-
#endif
|
474
|
+
#endif // TARGET_OS_OSX
|
471
475
|
|
472
476
|
@end
|
@@ -9,14 +9,30 @@
|
|
9
9
|
#import "RNGestureHandler.h"
|
10
10
|
|
11
11
|
#if TARGET_OS_OSX
|
12
|
+
|
13
|
+
#if RCT_NEW_ARCH_ENABLED
|
14
|
+
|
15
|
+
#include <react/renderer/core/LayoutMetrics.h>
|
16
|
+
|
17
|
+
@protocol RCTComponentViewProtocol;
|
18
|
+
|
19
|
+
#endif // RCT_NEW_ARCH_ENABLED
|
20
|
+
|
12
21
|
@interface RNGestureHandlerButton : NSControl
|
13
22
|
#else
|
14
23
|
@interface RNGestureHandlerButton : UIControl
|
15
|
-
#endif
|
24
|
+
#endif // TARGET_OS_OSX
|
16
25
|
/**
|
17
26
|
* Insets used when hit testing inside this view.
|
18
27
|
*/
|
19
28
|
@property (nonatomic, assign) UIEdgeInsets hitTestEdgeInsets;
|
20
29
|
@property (nonatomic) BOOL userEnabled;
|
21
30
|
|
31
|
+
#if TARGET_OS_OSX && RCT_NEW_ARCH_ENABLED
|
32
|
+
- (void)mountChildComponentView:(RNGHUIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index;
|
33
|
+
- (void)unmountChildComponentView:(RNGHUIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index;
|
34
|
+
- (void)updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics
|
35
|
+
oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics;
|
36
|
+
#endif
|
37
|
+
|
22
38
|
@end
|
@@ -10,6 +10,15 @@
|
|
10
10
|
|
11
11
|
#if !TARGET_OS_OSX
|
12
12
|
#import <UIKit/UIKit.h>
|
13
|
+
#else
|
14
|
+
#import <React/RCTUIKit.h>
|
15
|
+
#endif
|
16
|
+
|
17
|
+
#if RCT_NEW_ARCH_ENABLED
|
18
|
+
|
19
|
+
#import <React/RCTConversions.h>
|
20
|
+
#import <React/RCTFabricComponentsPlugins.h>
|
21
|
+
|
13
22
|
#endif
|
14
23
|
|
15
24
|
/**
|
@@ -82,4 +91,59 @@
|
|
82
91
|
}
|
83
92
|
#endif
|
84
93
|
|
94
|
+
#if TARGET_OS_OSX && RCT_NEW_ARCH_ENABLED
|
95
|
+
- (void)mountChildComponentView:(RNGHUIView *)childComponentView index:(NSInteger)index
|
96
|
+
{
|
97
|
+
if (childComponentView.superview != nil) {
|
98
|
+
return;
|
99
|
+
}
|
100
|
+
|
101
|
+
if (index < [[self subviews] count]) {
|
102
|
+
// Get the view currently at your desired index
|
103
|
+
NSView *existingView = [[self subviews] objectAtIndex:index];
|
104
|
+
|
105
|
+
// Now use this to insert your new view above the existing one
|
106
|
+
[self addSubview:childComponentView positioned:NSWindowAbove relativeTo:existingView];
|
107
|
+
} else {
|
108
|
+
// if the index is out of bounds, add the new subview at the end
|
109
|
+
[self addSubview:childComponentView];
|
110
|
+
}
|
111
|
+
}
|
112
|
+
|
113
|
+
- (void)unmountChildComponentView:(RNGHUIView *)childComponentView index:(NSInteger)index
|
114
|
+
{
|
115
|
+
[childComponentView removeFromSuperview];
|
116
|
+
}
|
117
|
+
|
118
|
+
- (void)updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics
|
119
|
+
oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics
|
120
|
+
{
|
121
|
+
bool forceUpdate = oldLayoutMetrics == facebook::react::EmptyLayoutMetrics;
|
122
|
+
|
123
|
+
if (forceUpdate || (layoutMetrics.frame != oldLayoutMetrics.frame)) {
|
124
|
+
CGRect frame = RCTCGRectFromRect(layoutMetrics.frame);
|
125
|
+
|
126
|
+
if (!std::isfinite(frame.origin.x) || !std::isfinite(frame.origin.y) || !std::isfinite(frame.size.width) ||
|
127
|
+
!std::isfinite(frame.size.height)) {
|
128
|
+
// CALayer will crash if we pass NaN or Inf values.
|
129
|
+
// It's unclear how to detect this case on cross-platform manner holistically, so we have to do it on the mounting
|
130
|
+
// layer as well. NaN/Inf is a kinda valid result of some math operations. Even if we can (and should) detect (and
|
131
|
+
// report early) incorrect (NaN and Inf) values which come from JavaScript side, we sometimes cannot backtrace the
|
132
|
+
// sources of a calculation that produced an incorrect/useless result.
|
133
|
+
RCTLogWarn(
|
134
|
+
@"-[UIView(ComponentViewProtocol) updateLayoutMetrics:oldLayoutMetrics:]: Received invalid layout metrics (%@) for a view (%@).",
|
135
|
+
NSStringFromCGRect(frame),
|
136
|
+
self);
|
137
|
+
} else {
|
138
|
+
self.frame = frame;
|
139
|
+
self.bounds = CGRect{CGPointZero, frame.size};
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
if (forceUpdate || (layoutMetrics.displayType != oldLayoutMetrics.displayType)) {
|
144
|
+
self.hidden = layoutMetrics.displayType == facebook::react::DisplayType::None;
|
145
|
+
}
|
146
|
+
}
|
147
|
+
#endif
|
148
|
+
|
85
149
|
@end
|
@@ -21,6 +21,15 @@ using namespace facebook::react;
|
|
21
21
|
RNGestureHandlerButton *_buttonView;
|
22
22
|
}
|
23
23
|
|
24
|
+
#if TARGET_OS_OSX
|
25
|
+
// Here we want to disable view recycling on buttons. Listeners are not removed from views when they're being unmounted,
|
26
|
+
// therefore after navigating through other screens buttons may have different actions then they are supposed to have.
|
27
|
+
+ (BOOL)shouldBeRecycled
|
28
|
+
{
|
29
|
+
return NO;
|
30
|
+
}
|
31
|
+
#endif
|
32
|
+
|
24
33
|
// Needed because of this: https://github.com/facebook/react-native/pull/37274
|
25
34
|
+ (void)load
|
26
35
|
{
|
@@ -40,12 +49,12 @@ using namespace facebook::react;
|
|
40
49
|
return self;
|
41
50
|
}
|
42
51
|
|
43
|
-
- (void)mountChildComponentView:(
|
52
|
+
- (void)mountChildComponentView:(RNGHUIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
|
44
53
|
{
|
45
54
|
[_buttonView mountChildComponentView:childComponentView index:index];
|
46
55
|
}
|
47
56
|
|
48
|
-
- (void)unmountChildComponentView:(
|
57
|
+
- (void)unmountChildComponentView:(RNGHUIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
|
49
58
|
{
|
50
59
|
[_buttonView unmountChildComponentView:childComponentView index:index];
|
51
60
|
}
|
@@ -97,7 +106,7 @@ using namespace facebook::react;
|
|
97
106
|
const auto &newProps = *std::static_pointer_cast<const RNGestureHandlerButtonProps>(props);
|
98
107
|
|
99
108
|
_buttonView.userEnabled = newProps.enabled;
|
100
|
-
#if !TARGET_OS_TV
|
109
|
+
#if !TARGET_OS_TV && !TARGET_OS_OSX
|
101
110
|
_buttonView.exclusiveTouch = newProps.exclusive;
|
102
111
|
#endif
|
103
112
|
_buttonView.hitTestEdgeInsets = UIEdgeInsetsMake(
|
package/package.json
CHANGED