当父视图具有userInteractionEnabled = NO时,即使其userInteractionEnabled属性设置为YES,其子视图也不会接受触摸事件。
有没有办法在子视图中获取触摸事件?
答案 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,而不是禁用整个父视图的用户交互