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



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

这是功能更改还是解决方法的已知问题?我在StackOverflow、苹果开发者论坛或苹果文档中找不到任何信息。

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

在iPhone 6和iPhone 6S上都观察到了这一点,因此它不太可能与3D触摸功能有关,因为iPhone 6不支持3D触摸功能。

编辑:我们将在睡眠后进行进一步调查,但我认为违规区域的触摸事件实际上正在生成。问题是时间问题,通常在触摸结束事件之前约20-50ms接收触摸开始事件,即使是快速按压。然而,在这些顶部和底部区域,我几乎在触摸开始后立即收到触摸结束事件(小于1ms)。我的工作原理是,iOS会推迟触摸事件,看看它是否变成了滑动手势,只有在决定不作为滑动处理时才会发送touchesBegan事件。可能需要改进我的输入代码,这样一开始就结束的触摸就不会从裂缝中掉出来,最终被游戏代码忽略(不幸的是,游戏代码会轮询触摸状态,而不是由事件驱动)。

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

像这样:

override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {
return .all
}

参见文档

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

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

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

最好的解决方案可能是在整个应用程序中驱动输入处理事件。我觉得这在我的情况下是不切实际的,因为在多个项目中会影响大量的代码。我的解决方案是检测这种情况,在应用程序有机会注意到触摸发生之前,不允许触摸结束事件影响触摸状态。

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

最新更新