在iOS游戏中禁用iOS可达性滑动手势

4
我有一个iOS游戏,屏幕底部有几个可能被滑动的控件。当玩家向下滑动时,如果手指滑出屏幕底部,可触发可触及性手势。然后,这会滑动屏幕,将这些控件移出页面并隐藏一半的游戏。显然,这不是玩家的意图,并且需要他们非常具体地进行滑动,这不太直观或有趣。
在圆角iPhone套件上,控件距离屏幕底部大约100pt,以便为主页指示器腾出空间,在许多情况下有助于防止此问题,但在方形设备上,它们更接近10pt:

Swipe down example

在我进行的初步测试中,我发现即使在屏幕上高达300pt的位置开始滑动,一直滑到屏幕底部,也会触发可及性功能。因此,将我的控件提高并不是一个解决方案,因为这会把它们放在屏幕中心(也会阻碍游戏的焦点),而且对于某些手机上的手指来说也不容易触及。
由于在我的游戏中可及性功能没有任何用处(屏幕上部没有为了让你的手保持在屏幕下部的控件),我真的很想找到一种方法来防止这种情况发生。理想情况下,在游戏过程中可以通过某种方式告知系统它是不必要的,这样我就可以在非游戏菜单中允许它——但我可能是在做白日梦。我也不认为要求用户在整个系统范围内禁用这个功能是一个好的解决方案,因为这是我的应用程序的冲突,需要他们在其他地方改变自己的行为。
是否有关于如何处理与这个特定可及性手势冲突的指导、示例或建议?

禁用手势以拉下表单页面/表单页模态呈现。 - Somoy Das Gupta
1个回答

7

你不想禁用它,而是想推迟它。

参见https://developer.apple.com/documentation/uikit/uiviewcontroller/2887512-preferredscreenedgesdeferringsys

为了使用它,你需要重写preferredScreenEdgesDeferringSystemGestures来延迟需要延迟的屏幕部分。

在您的情况下:

override func preferredScreenEdgesDeferringSystemGestures() -> UIRectEdge {
    return [.bottom]
}

如果您以动态方式执行此操作,则还需要调用setNeedsUpdateOfScreenEdgesDeferringSystemGestures()来通知iOS您的规则正在更改。


4
据我所知并尝试过,preferredScreenEdgesDeferringSystemGestures 属性对 Reachability 手势没有影响。 - Dandy
1
每个手势都有可以使用的委托函数。如果我不是在移动中,我会更详细地阐述。 - Knight0fDragon
3
这个回答得票很高,但我想再次声明,它不起作用。虽然推迟底部系统手势可以防止像向上滑动返回主屏幕这样的操作,但在纵向模式下,它对可及性手势“轻点两下屏幕”没有任何影响。你可以通过像《纪念碑谷》这样实现推迟行为的游戏来验证,或者自己试一试。我会感激任何额外的细节。 - Dandy
2
我最近收到了来自苹果的反馈,表明这可能是一个错误,并且preferredScreenEdgesDeferringSystemGestures应该会产生影响。我已经明确询问过了,如果情况属实(并且如果修复措施得以推出),我将标记此问题为已解决 :) - Dandy
1
我一直在尝试它。技术上它确实有影响。您无法使用X的引入禁用或取消任何屏幕手势。系统中有某些东西确定是否发生了延迟,并且通过再次执行来触发手势。问题可能是系统有时在后台注册手势两次,这就是为什么它不能正常工作的原因。 - Knight0fDragon
显示剩余11条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接