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

时间:2014-08-11 08:20:51

标签: ios objective-c uiview uicontainerview

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

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

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

1 个答案:

答案 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

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