isExclusiveTouch 不适用于自定义 UIView

Lui*_*ily 2 iphone uikit ios swift

我有一个包含两个子视图的视图:一个由 UIPageViewController 顶部的自定义视图组成的栏

我想避免用户能够同时触摸栏和页面视图(栏控制页面视图,同时触摸它们会导致崩溃)

我所做的是将栏视图 isExclusiveTouch 属性设置为 true。

override func awakeFromNib() {
    [...]
    isExclusiveTouch = true
}
Run Code Online (Sandbox Code Playgroud)

文档说,如果某个视图的 isExclusiveTouch 属性设置为 true,同一窗口中的其他视图应该无法接收任何触摸事件。然而,我可以在触摸栏的同时在页面视图中进行触摸和滚动。

在另一个屏幕上,我有多个由自定义视图组成的开关,我想避免同时触摸多个开关,因此我也将它们的 isExclusiveTouch 设置为 true,但仍然可以同时触摸其中两个。

我错过了 isExclusiveTouch 根本不起作用?

小智 5

ExclusiveTouch 仅在独占触摸视图中存在活动触摸时阻止其他视图中的触摸。也就是说,如果您将手指放在独占触摸视图中,则在抬起第一根手指之前,触摸不会在其他视图中开始。如果 ExclusiveTouch 视图中当前没有触摸,则它不会阻止在其他视图中启动触摸。

要真正使此视图成为屏幕上唯一可以接收触摸的内容,您需要在其他所有内容之上添加另一个视图以捕获其余的触摸,或者在层次结构中的某个位置(或您的 UIWindow 本身)对视图进行子类化并覆盖 hitTest:withEvent: 以便在文本视图可见时始终返回文本视图,或者对于不在文本视图中的触摸返回 nil。

来源