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 addTargetaddTarget:action:
validation目标没有被添加或移除。 - 对于这两个实例,
delegate
始终nil
。 - 如果你禁用手势识别器,他们将重新启用自己
- 当您从底部拖动或从顶部向下拖动时,不会延迟内容的手势会触发。 我无法触发延迟触摸的实例。