【问题标题】:UISystemGateGestureRecognizer and delayed taps near bottom of screenUISystemGateGestureRecognizer 和屏幕底部附近的延迟点击
【发布时间】:2023-03-30 04:30:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: ios iphone uikit uigesturerecognizer uitouch


【解决方案1】:

这种延迟的触摸也让我感到困扰。 就像前面所说的一样, 这是一个简单的解决方法:

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
}

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

【讨论】:

  • view.window 为我返回了一个 nil 实例
  • 这对我有用,但我确实在我的控制台中得到了以下内容[Warning] Trying to set delaysTouchesBegan to NO on a system gate gesture recognizer - this is unsupported and will have undesired side effects 知道这是否会阻止我的应用在审核期间被接受吗??
  • @JessMcKenzie 你得到答案了吗?我收到相同的控制台消息。
【解决方案2】:

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

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

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

【讨论】:

  • 延迟触发器是否可以用于具有滚动视图的应用程序中使用的点击状态栏到滚动到顶部功能?理论上,它只会在屏幕上有滚动视图时触发。此外,由于这些是内部类,它们可以通过非传统方式发送事件——例如触发 NSNotification,甚至调用私有 API 单例对象/方法。
猜你喜欢
  • 2019-05-08
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 2021-01-29
  • 1970-01-01
相关资源
最近更新 更多