19

安装在iOS 应用UISystemGestureGateGestureRecognizers顶层的标准是什么?UIView

我的应用程序包含两个视图 - 一个填充屏幕的上半部分,另一个是自定义键盘并填充下半部分。我发现空格键上的点击并不总是有效,经过一些调查后发现底部 20 像素左右的点击事件的时间与视图的其余部分不同。在大多数视图中,touchesBegan/Ended 之间的时间间隔约为 100 毫秒,而空格键则为 1-2 毫秒。(我的应用程序是一个模拟器,它检测到按键太快了)。

经过更多挖掘后,我发现UIView应用程序的主要部分(即:我的主视图的超级视图)UISystemGestureGateGestureRecognizer安装了 2 。通过删除它们在ViewDidAppear屏幕底部不再受到影响。(大概这些正在取消对我的键盘的触摸按下事件,因此时间更快)。

这些系统识别器至少存在于 iOS 5 到 7 以及 iPad 和 iPhone 上。我认为它们可能与从顶部/底部滑动有关,但此功能在删除它们后仍然有效。

所以我有一个修复,但我想更多地了解这里发生的事情 - 特别是通过删除这些可能会破坏什么。

4

2 回答 2

16

这种延迟的接触也困扰着我。就像之前所说的一样,这里有一个简单的修复:

override func viewDidAppear(_ animated: Bool) {
    let window = view.window!
    let gr0 = window.gestureRecognizers![0] as UIGestureRecognizer
    let gr1 = window.gestureRecognizers![1] as UIGestureRecognizer
    gr0.delaysTouchesBegan = false
    gr1.delaysTouchesBegan = false
}

无需删除那些手势识别器。只需将其添加到主视图控制器即可。

于 2014-11-28T12:35:02.087 回答
7

这些识别器似乎是为了防止屏幕顶部和底部附近的意外触摸。它们没有配置任何目标,但可以(像 any 一样UIResponder)吸收触摸以防止它们向上传递到响应者链。

注意事项(在 iOS 7.1 上测试):

  • 两个手势识别器始终存在于键窗口中。
  • 检查了两个手势的_targetsivar,发现它们根本没有配置任何目标。调出addTarget:action:以验证目标没有被即时添加或删除。
  • delegate始终nil适用于这两种情况。
  • 如果您禁用手势识别器,它们将重新启用自己
  • 当您从底部向上拖动或从顶部向下拖动时,不会延迟内容触摸的手势会触发。我无法触发延迟触摸的实例。
于 2014-06-11T14:18:42.970 回答