UISystemGateGestureRecognizer和屏幕底部附近的延迟点击

时间:2013-11-05 22:04:20

标签: ios iphone uikit uigesturerecognizer uitouch

iOS应用的顶级UISystemGestureGateGestureRecognizers上安装了哪些标准UIView

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

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

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

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

2 个答案:

答案 0 :(得分:15)

这种延迟的接触也困扰着我。 正如之前所说的那样, 这是一个简单的解决方法:

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
}

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

答案 1 :(得分:6)

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

备注(在iOS 7.1上测试):

  • 两个手势识别器始终存在于关键窗口中。
  • inspected both gestures' _targets ivar,发现他们根本没有配置任何目标。调出addTarget:action:以验证是否未动态添加或删除目标。
  • 对于两个实例,
  • delegate始终为nil
  • 如果您停用手势识别器,他们将重新启用
  • 当您从底部向上拖动或从顶部向下拖动时,不会延迟内容触摸的手势会触发。我无法触发延迟触摸的实例。