|
7 | 7 | #import <react/renderer/components/rngesturehandler_codegen/EventEmitters.h> |
8 | 8 | #import <react/renderer/components/rngesturehandler_codegen/Props.h> |
9 | 9 | #import <react/renderer/components/rngesturehandler_codegen/RCTComponentViewHelpers.h> |
| 10 | +#import <react/renderer/components/view/ViewProps.h> |
10 | 11 |
|
11 | 12 | #import "RNGestureHandlerButton.h" |
12 | 13 |
|
13 | 14 | using namespace facebook::react; |
14 | 15 |
|
| 16 | +static RNGestureHandlerPointerEvents RCTPointerEventsToEnum(facebook::react::PointerEventsMode pointerEvents) |
| 17 | +{ |
| 18 | + switch (pointerEvents) { |
| 19 | + case facebook::react::PointerEventsMode::None: |
| 20 | + return RNGestureHandlerPointerEventsNone; |
| 21 | + case facebook::react::PointerEventsMode::BoxNone: |
| 22 | + return RNGestureHandlerPointerEventsBoxNone; |
| 23 | + case facebook::react::PointerEventsMode::BoxOnly: |
| 24 | + return RNGestureHandlerPointerEventsBoxOnly; |
| 25 | + case facebook::react::PointerEventsMode::Auto: |
| 26 | + default: |
| 27 | + return RNGestureHandlerPointerEventsAuto; |
| 28 | + } |
| 29 | +} |
| 30 | + |
15 | 31 | @interface RNGestureHandlerButtonComponentView () <RCTRNGestureHandlerButtonViewProtocol> |
16 | 32 | @end |
17 | 33 |
|
@@ -205,8 +221,35 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared & |
205 | 221 | _buttonView.hitTestEdgeInsets = UIEdgeInsetsMake( |
206 | 222 | -newProps.hitSlop.top, -newProps.hitSlop.left, -newProps.hitSlop.bottom, -newProps.hitSlop.right); |
207 | 223 |
|
| 224 | + if (!oldProps) { |
| 225 | + _buttonView.pointerEvents = RCTPointerEventsToEnum(newProps.pointerEvents); |
| 226 | + } else { |
| 227 | + const auto &oldButtonProps = *std::static_pointer_cast<const RNGestureHandlerButtonProps>(oldProps); |
| 228 | + if (oldButtonProps.pointerEvents != newProps.pointerEvents) { |
| 229 | + _buttonView.pointerEvents = RCTPointerEventsToEnum(newProps.pointerEvents); |
| 230 | + } |
| 231 | + } |
| 232 | + |
208 | 233 | [super updateProps:props oldProps:oldProps]; |
209 | 234 | } |
| 235 | + |
| 236 | +#if !TARGET_OS_OSX |
| 237 | +// Override hitTest to forward touches to _buttonView |
| 238 | +// This is necessary because RCTViewComponentView's hitTest might handle pointerEvents |
| 239 | +// from ViewProps and prevent touches from reaching _buttonView (which is the contentView). |
| 240 | +// Since _buttonView has its own pointerEvents handling, we always forward to it. |
| 241 | +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event |
| 242 | +{ |
| 243 | + if (![self pointInside:point withEvent:event]) { |
| 244 | + return nil; |
| 245 | + } |
| 246 | + |
| 247 | + CGPoint buttonPoint = [self convertPoint:point toView:_buttonView]; |
| 248 | + |
| 249 | + return [_buttonView hitTest:buttonPoint withEvent:event]; |
| 250 | +} |
| 251 | +#endif |
| 252 | + |
210 | 253 | @end |
211 | 254 |
|
212 | 255 | Class<RCTComponentViewProtocol> RNGestureHandlerButtonCls(void) |
|
0 commit comments