Swift:在另一个UIView下的UIView的hitTest

我有RedOrGreenUIView顶部的TransparentUIView。 TransparentUIView有一个UILongPressGestureRecognizer附加到它。 一旦用户开始长时间的触摸,我检查这个LongPressGesture的.Changed状态,并在hitTest下执行:

var p:CGPoint = rec.locationInView(self.view) var selectedView = view.hitTest(p, withEvent: nil) if selectedView != nil { if selectedView == TransparentUIView { println("TransparentUIView is being touched") } } 

我将TransparentView作为selectedView处理。 但是我需要能够在RedOrGreenUIView上同时进行一次hitTest,这是在TransparentUIView下面。 我无法得到我的头来完成这一点。 请帮忙。

如果一个UIView触摸,下面的其他人没有得到任何。

所以要么你可以有一个中心类传递给你的UIView对象,或者是第一个UIView,它将UITouch对象传递给下面的UIView并执行hitTest。

为你的容器创build一个自定义的视图,并重写pointInside:消息,当点不在一个符合条件的子视图内时,返回NO,如下所示:

 @interface PassthroughView : UIView @end @implementation PassthroughView -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { for (UIView *view in self.subviews) { if (!view.hidden && view.alpha > 0 && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) return YES; } return NO; } @end 

迅捷的版本

 class PassThroughView: UIView { override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { for subview in subviews as [UIView] { if !subview.hidden && subview.alpha > 0 && subview.userInteractionEnabled && subview.pointInside(convertPoint(point, toView: subview), withEvent: event) { return true } } return false } } 

Swift 4版本:

  func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { for subview in YourView.subviews as [UIView] { if !subview.isHidden && subview.alpha > 0 && subview.isUserInteractionEnabled && subview.point(inside:point, with: event) { return true } } return false }