在iOS上,如果superview的userInteractionEnabled为NO,那么所有子视图也会被禁用?

nop*_*ole 28 iphone uikit uiview uiresponder ios

我认为当触摸或点击视图时,首先调用其处理程序,然后调用其superview的处理程序(向上传播).

但是,如果将superview userInteractionEnabled设置为NO,那么所有子视图和后代也会因用户交互而被禁用吗?如果我们只想禁用主视图但又不想禁用子视图,该怎么办?

nop*_*ole 26

如果这可能会有所帮助,我在Matt Neuburg编程的iOS 5中发现了这一点.467:

userInteractionEnabled

如果设置为NO,则此视图(及其子视图)将从接收触摸中排除.触摸此视图或其中一个子视图"落到"后面的视图.

此外,Apple的iOS事件处理指南说:

窗口对象使用命中测试和响应者链来查找接收触摸事件的视图.在命中测试中,窗口在视图层次结构的最顶层视图上调用hitTest:withEvent:此方法通过在视图层次结构中返回YES的每个视图上递归调用pointInside:withEvent:继续执行,继续向下移动层次结构,直到找到触摸发生在其边界内的子视图.该视图成为热门测试视图.

和编程的iOS 5由Matt诺伊堡,p.485提到,如果一个视图被标记userInteractionEnabledNO,或hidden作为YES,或不透明度是接近0,则视图及其子视图不会被遍历HitTest(并且因此不被认为是对任何触摸) .


Pat*_*pel 20

您可以覆盖hitTest(_:withEvent:)以忽略视图本身,但仍然可以为其子视图提供触摸.

class ContainerStackView : UIStackView {
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
        let result = super.hitTest(point, withEvent: event)
        if result == self { return nil }
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)


Oma*_*ith 17

你不能那样做,

相反,你会改变你的观点的安排,如下所示:

Main View-> subViews
Run Code Online (Sandbox Code Playgroud)

Container View -> Main View that you want to set as inactive
               -> other views that you want to still active
Run Code Online (Sandbox Code Playgroud)

因此,您当前的主视图和当前的子视图将成为新容器视图的兄弟姐妹

  • “不能那样做”什么是“那个”?您指的是问题的哪一部分? (2认同)