From 2572449c9e1756ba5010d451b62bb99513677560 Mon Sep 17 00:00:00 2001 From: Boopathi Rajaa Date: Thu, 2 Apr 2015 10:04:58 -0700 Subject: [PATCH] Fix hitTest for auto Summary: - Returns matching subview hitTest or super hitTest if no match found. Should fix #99 . Closes https://github.com/facebook/react-native/pull/501 Github Author: Boopathi Rajaa Test Plan: Imported from GitHub, without a `Test Plan:` line. --- React/Views/RCTView.m | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/React/Views/RCTView.m b/React/Views/RCTView.m index febf56703ce5c9..d40798302b2a94 100644 --- a/React/Views/RCTView.m +++ b/React/Views/RCTView.m @@ -16,6 +16,20 @@ static const RCTBorderSide RCTBorderSideCount = 4; +static UIView *RCTViewHitTest(UIView *view, CGPoint point, UIEvent *event) +{ + for (UIView *subview in [view.subviews reverseObjectEnumerator]) { + if (!subview.isHidden && subview.isUserInteractionEnabled && subview.alpha > 0) { + CGPoint convertedPoint = [subview convertPoint:point fromView:view]; + UIView *subviewHitTestView = [subview hitTest:convertedPoint withEvent:event]; + if (subviewHitTestView != nil) { + return subviewHitTestView; + } + } + } + return nil; +} + @implementation UIView (RCTViewUnmounting) - (void)react_remountAllSubviews @@ -120,20 +134,11 @@ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event case RCTPointerEventsNone: return nil; case RCTPointerEventsUnspecified: - return [super hitTest:point withEvent:event]; + return RCTViewHitTest(self, point, event) ?: [super hitTest:point withEvent:event]; case RCTPointerEventsBoxOnly: return [super hitTest:point withEvent:event] ? self: nil; case RCTPointerEventsBoxNone: - for (UIView *subview in [self.subviews reverseObjectEnumerator]) { - if (!subview.isHidden && subview.isUserInteractionEnabled && subview.alpha > 0) { - CGPoint convertedPoint = [subview convertPoint:point fromView:self]; - UIView *subviewHitTestView = [subview hitTest:convertedPoint withEvent:event]; - if (subviewHitTestView != nil) { - return subviewHitTestView; - } - } - } - return nil; + return RCTViewHitTest(self, point, event); default: RCTLogError(@"Invalid pointer-events specified %zd on %@", _pointerEvents, self); return [super hitTest:point withEvent:event];