From dbf5bea3c165fae39a3548d58818f78f1bbe785d Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Fri, 7 Sep 2018 23:39:02 -0700 Subject: [PATCH] Fabric: Custom `[RCTViewComponentView hitTest:]` that takes `pointerEvents` into an account Summary: @public In RN we have special `pointerEvents` prop that controls whether the View can be the target of touch events. This is a pretty straight-forward implementation of that. Reviewed By: sahrens Differential Revision: D9688877 fbshipit-source-id: 1524647b0a33e4dd14563f531d636469bf3bdef7 --- .../ComponentViews/View/RCTViewComponentView.mm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index 77cb3d1e5..720482e1a 100644 --- a/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -196,6 +196,22 @@ using namespace facebook::react; [self invalidateLayer]; } +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event +{ + auto viewProps = *std::static_pointer_cast(_props); + switch (viewProps.pointerEvents) { + case PointerEventsMode::Auto: + return [super hitTest:point withEvent:event]; + case PointerEventsMode::None: + return nil; + case PointerEventsMode::BoxOnly: + return [self pointInside:point withEvent:event] ? self : nil; + case PointerEventsMode::BoxNone: + UIView *view = [super hitTest:point withEvent:event]; + return view != self ? view : nil; + } +} + static RCTCornerRadii RCTCornerRadiiFromBorderRadii(BorderRadii borderRadii) { return RCTCornerRadii { .topLeft = (CGFloat)borderRadii.topLeft,