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

Bra*_*son 18 iphone uikit uitouch uigesturerecognizer ios

iOS应用程序UISystemGestureGateGestureRecognizers顶级安装的标准UIView是什么?

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

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

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

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

hei*_*iko 17

这种延迟的触动也困扰着我.正如之前所说的那样,这是一个简单的修复:

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
}
Run Code Online (Sandbox Code Playgroud)

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


Aus*_*tin 7

看来这些识别器旨在防止屏幕顶部和底部附近的意外触摸.它们没有配置任何目标,但可以(像任何一样UIResponder)吸收触摸以防止它们被传递到响应链.

备注(在iOS 7.1上测试):

  • 两个手势识别器始终存在于关键窗口中.
  • 检查了两个手势' _targetsivar,发现它们根本没有配置任何目标.调出addTarget:action:以确认目标没有被动态添加或删除.
  • delegate总是nil适用于两种情况.
  • 如果禁用手势识别器,它们将重新启用
  • 当您从底部向上拖动或从顶部向下拖动时,不会延迟内容触摸的手势会触发.我无法触发延迟触摸的实例.