如何使触摸事件影响容器视图背后的视图?

我有一个完全覆盖另一个UIView的容器视图。 容器视图具有透明度以及一些其他内容(搜索栏,表格视图等)。 我希望触摸事件通过容器视图,并在事件发生在透明区域时影响下面的视图。

我一直在搞乱容器视图的子类。 我正在尝试使用pointInside:方法根据上述标准(透明容器视图)返回YES或NO。 我的问题是据我所知,我只能访问容器视图子视图,而不是容器视图下面的视图。

我目前一直在使用一种非常低效的方法来读取触摸的像素alpha。 这样做最好的方法是什么?

如果你只是希望触摸通过你的容器视图,同时仍然让它的子视图能够处理触摸,你可以UIView并覆盖hitTest:withEvent:像这样:

迅速:

 class PassthroughView: UIView { override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { // Get the hit view we would normally get with a standard UIView let hitView = super.hitTest(point, with: event) // If the hit view was ourself (meaning no subview was touched), // return nil instead. Otherwise, return hitView, which must be a subview. return hitView == self ? nil : hitView } } 

Objective-C的:

 @interface PassthroughView : UIView @end @implementation PassthroughView - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // Get the hit view we would normally get with a standard UIView UIView *hitView = [super hitTest:point withEvent:event]; // If the hit view was ourself (meaning no subview was touched), // return nil instead. Otherwise, return hitView, which must be a subview. return hitView == self ? nil : hitView; } @end 

然后让您的容器视图成为该类的实例。 此外,如果您希望触摸通过上面的视图控制器视图,您将需要使该视图控制器的视图也是该类的实例。