UISystemGateGestureRecognizer和延迟接近屏幕底部的水龙头

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

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

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

这些系统识别器至less在iOS 5至iOS 7以及iPad和iPhone上都有。 我以为他们可能是从顶部/底部刷卡有关,但这个function仍然适用于他们删除。

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

这推迟了也引起了我的困扰。 就像之前所说的那样,下面是一个简单的解决办法:

 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 } 

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

看起来,这些识别器是为了防止屏幕顶部和底部附近的意外触摸。 他们没有configuration任何目标,但可以(像任何UIResponder )吸收触摸,以防止他们被传递到响应者链。

备注(在iOS 7.1上testing):

  • 两个手势识别器总是出现在关键窗口中。
  • 我检查了两个手势' _targets伊娃 ,发现他们没有configuration任何目标。 swizzled out addTarget addTarget:action:validation目标没有被添加或移除。
  • 对于这两个实例, delegate始终nil
  • 如果你禁用手势识别器,他们将重新启用自己
  • 当您从底部拖动或从顶部向下拖动时,不会延迟内容的手势会触发。 我无法触发延迟触摸的实例。