我有一个完全覆盖另一个UIView的容器视图。容器视图具有透明度以及一些其他内容(搜索栏,表格视图等)。我希望触摸事件通过容器视图,并在事件发生在透明区域时影响下面的视图。
我一直在搞乱容器视图的子类。我正在尝试使用pointInside:方法根据上述标准(透明容器视图)返回YES或NO。我的问题是据我所知,我只能访问容器视图子视图,而不是容器视图下面的视图。
我目前使用非常低效的方法来读取触摸的像素alpha。这样做最好的方法是什么?
答案 0 :(得分:6)
如果您只想让触摸通过您的容器视图,同时仍然让其子视图能够处理触摸,您可以继承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
}
}
<强>目标-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
然后让您的容器视图成为该类的实例。此外,如果您希望您的触摸通过上述视图控制器的视图,您将需要使该视图控制器的视图也是该类的实例。