iOS 11.1 游戏的顶部和底部触摸无反应

Top and bottom of iOS 11.1 games unresponsive to touch

自从安装 iOS 11.1 后,我们发现屏幕顶部和底部的条带对触摸没有反应。这会影响我开发的横向应用程序和纵向应用程序(它们使用金属 API 进行渲染)。在其他一些开发人员的应用程序中也观察到了该问题,例如Golf Clash 但不是其他 - 因为我们使用内部引擎,所以我们的应用程序和其他开发人员的应用程序之间没有共享代码。

这是功能更改还是解决方法的已知问题?我在 Whosebug 或 Apple Developer 论坛或 Apple 文档中找不到任何信息。

可能与 iOS11 中出现的安全区的引入有关,我们的游戏还没有完全支持这些安全区(但我没想到安全区会影响触摸,或出现在现有设备上).也许这与新的通知向下滑动和控制中心向上滑动行为有关——我们注意到它们过去常常在第一次滑动时打开一个选项卡,但现在它们会立即打开,但是,进入设置并禁用控制中心在应用程序中没有修复它。

在 iPhone6 和 iPhone6S 上都观察到,因此它不太可能与 3D 触摸功能相关,因为 iPhone6 不支持该功能。

编辑:睡一觉后会进一步调查,但我认为违规区域的触摸事件实际上正在生成。问题是时间问题之一,通常在 touchesEnded 事件之前大约 20-50 毫秒收到 touchesBegan 事件,即使是快速按下也是如此。但是,在这些顶部和底部区域,我几乎在 touchesBegan 之后立即收到了 touchesEnded 事件(不到 1 毫秒)。我的工作理论是 iOS 正在阻止触摸事件以查看它是否变成滑动手势,并且只有在确定不会将其作为滑动处理时才发送 touchesBegan 事件。可能必须改进我的输入代码,这样一开始就结束的触摸不会漏掉并最终被游戏代码忽略(不幸的是,它轮询触摸状态而不是事件驱动)。

在这里回答我自己的问题:

iOS11.1 似乎确实改变了屏幕顶部和底部触摸事件的时间。据推测,这是为了处理用于打开通知和控制中心的新的单次滑动手势。 touchesBegan 事件和 touchesEnded 事件几乎同时出现。

我相信,如果我确实提交了一份 Radar,Apple 会认为行为改变是设计好的(而且是合理的)。但是,遵循将触摸事件处理为触摸状态,然后轮询该触摸状态以检测按钮按下的模式的应用程序很可能会崩溃。该方法失败了,因为这些触摸在添加后立即从触摸状态中删除,轮询代码没有机会观察它们。

最好的解决方法可能是在整个应用程序中使输入处理由事件驱动。我觉得这对我来说是不切实际的,因为会影响多个项目的代码量。我的解决方法是检测这种情况,并且不允许 touchesEnded 事件影响触摸状态,直到 App 有机会注意到触摸已经发生。

顺便说一句,如果您在辅助功能设置中启用放大手势,则可以在 Android 上观察到类似的行为(OS 再次阻止来自应用程序的触摸事件,直到它确定一个手势没有发生 - 在这种情况下是三次点击)。我很高兴在解决这个 iOS11.1 问题时,我还解决了我的 Android 应用程序也与放大手势不兼容的问题。

如果您希望您的手势优先于系统手势,您应该在视图控制器中覆盖 属性 preferredScreenEdgesDeferringSystemGestures

像这样:

override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
    return .all
}

docs