当父视图在iOS中将userInteractionEnabled设置为NO时,如何进行触摸

时间:2011-01-11 19:11:03

标签: ios uikit touch uiresponder

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

有没有办法在子视图中获取触摸事件?

4 个答案:

答案 0 :(得分:74)

要获取视图以允许触摸传递,但让其子视图处理触摸,请将该视图上的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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

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

我希望以下代码能对您有所帮助。

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
        }
    }
}

答案 3 :(得分:-1)

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