41

当父视图的 userInteractionEnabled=NO 时,即使它们的 userInteractionEnabled 属性设置为 YES,它的子视图也不会接受触摸事件。

有没有办法在子视图中仍然获得触摸事件?

4

4 回答 4

76

要获得一个让触摸通过但让其子视图处理触摸的视图,请让该视图上的 userInteractionEnabled 为 YES,然后使用以下代码段:

-(id)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    id hitView = [super hitTest:point withEvent:event];
    if (hitView == self) return nil;
    else return hitView;
}

来源:http ://cocoaheads.tumblr.com/post/2130871776/ignore-touches-to-uiview-subclass-but-not-to-its

于 2011-11-12T12:13:56.253 回答
4

将父视图的 userInteractionEnabled 属性设置为 NO 也会将其子视图的 userInteractionEnabled 属性也隐式设置为 NO。我不知道使用您描述的方法将触摸事件传递给子视图的方法,但也许您可以创建一个视图来简单地覆盖您希望用户与之交互的视图,但不是那些的父视图意见。

于 2011-03-07T13:10:33.413 回答
4

Swift 解决方案 - 您需要为父视图创建一个自定义视图类,并将以下代码添加到其中。请保持父视图的用户交互启用。

希望下面的代码对你有所帮助。

class MyCustomParentView: UIView {    
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let hitView = super.hitTest(point, with: event)
        if hitView == self {
            return nil
        } else {
            return hitView
        }
    }
}
于 2018-08-14T06:37:00.510 回答
-2

解决方法是将按钮等的用户交互禁用为零,而不是禁用整个父视图的用户交互

于 2013-02-28T06:51:47.023 回答