From b997e3f010b0e1eceb3b5835c820cecb124f0bf0 Mon Sep 17 00:00:00 2001 From: Sean Purcell Date: Wed, 15 Apr 2015 23:49:47 -0700 Subject: [PATCH 1/2] use zPosition in RCTViewHitTest to properly route touches --- React/Views/RCTView.m | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/React/Views/RCTView.m b/React/Views/RCTView.m index d40798302b2a94..4ae4e5f56b4676 100644 --- a/React/Views/RCTView.m +++ b/React/Views/RCTView.m @@ -18,15 +18,30 @@ static UIView *RCTViewHitTest(UIView *view, CGPoint point, UIEvent *event) { + NSMutableArray *hits = [[NSMutableArray alloc] init]; 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; + [hits addObject:subviewHitTestView]; } } } + + float z = -HUGE_VALF; + UIView *highestView; + for (UIView *subview in [hits objectEnumerator]) { + if (subview.layer.zPosition > z) { + highestView = subview; + z = subview.layer.zPosition; + } + } + + if (highestView != nil) { + return highestView; + } + return nil; } From a593d1d660a3805f83ab3ff0bf7495341e1f0343 Mon Sep 17 00:00:00 2001 From: Sean Purcell Date: Thu, 16 Apr 2015 16:54:09 -0700 Subject: [PATCH 2/2] compare zindex of sibling views --- React/Views/RCTView.m | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/React/Views/RCTView.m b/React/Views/RCTView.m index 4ae4e5f56b4676..8c02573567bd51 100644 --- a/React/Views/RCTView.m +++ b/React/Views/RCTView.m @@ -18,31 +18,22 @@ static UIView *RCTViewHitTest(UIView *view, CGPoint point, UIEvent *event) { - NSMutableArray *hits = [[NSMutableArray alloc] init]; + float currentZ = -HUGE_VALF; + UIView *highestView = nil; + 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) { - [hits addObject:subviewHitTestView]; + if (highestView == nil || subview.layer.zPosition > currentZ) { + UIView *subviewHitTestView = [subview hitTest:convertedPoint withEvent:event]; + if (subviewHitTestView != nil) { + currentZ = subview.layer.zPosition; + highestView = subviewHitTestView; + } } } } - - float z = -HUGE_VALF; - UIView *highestView; - for (UIView *subview in [hits objectEnumerator]) { - if (subview.layer.zPosition > z) { - highestView = subview; - z = subview.layer.zPosition; - } - } - - if (highestView != nil) { - return highestView; - } - - return nil; + return highestView; } @implementation UIView (RCTViewUnmounting)