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提到,如果一个视图被标记userInteractionEnabled
为NO
,或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)
因此,您当前的主视图和当前的子视图将成为新容器视图的兄弟姐妹
归档时间: |
|
查看次数: |
17105 次 |
最近记录: |