落格输入法 X 是如何处理屏幕边缘延迟问题的

问题

在开发落格输入法的过程中,我就一直被一个问题所困扰,那就是当用户点击在屏幕左侧边缘时, UIButton  的 touchDown  event 几乎变成了 touchUpInside 。也就是说,这两个同时发生,而当你仅按下的时候, touchDown 不再被调用要等到你抬起手指的那一瞬间,才触发 touchDown 。 这在键盘上就很明显了,按键音、按键视觉提示和震动提示都因此而延后,在连续输入的时候,一旦遇到屏幕左侧边缘的 Q 键,则明显要感觉键入流程卡顿一下。 这个问题其实是由于 3D Touch 切换多任务以及从屏幕边缘向右滑动返回的手势导致的。由于这两者是 iOS 系统全局的,所以我们很难绕过这一上游 bug。
甚至在 iPhone X 系列的全面屏里,键盘的这个问题不但没有得到改进,反而变成了屏幕两边都延迟的情况。

App 里的解决办法

这个错误由来已久,但直到 iOS 11,才勉强算是有了解决办法: preferredScreenEdgesDeferringSystemGestures: UIRectEdge的你需要在你的 ViewController 中重写这个变量,让你的 app 优先级高于系统手势即可。

键盘里的配置方案

上文中提出的办法,在键盘扩展中是无法生效的——因为并没有权限。为此,我做了一个 UIButton 的子类,并在其中使用 func point(inside point: CGPoint, with event: UIEvent?) -> Bool 这个方法来判断用户点击,它的优势是不论用户点击到哪里,都会第一时间被触发。 当判定点击的是当前 Button 时,我们手动触发 touchDown 调用。 这样不论用户点击到哪里,键盘都可以在第一时间正确响应了——但是,新的问题随之而来,由于点击本身也会产生 touchDown ,所有的正常点击就都变成了两份(或多份,连续的 touchDown 已经让 event 变成了 touchDownRepeat),你需要做额外的点击过滤,由于点击效果的传递实现五花八门,这里就不做深入展开了。

发布者:R0uter

如非声明,本人所著文章均为原创手打,转载请注明本页面链接和我的名字。

加入对话

2条评论

电子邮件地址不会被公开。 必填项已用*标注

    1. 很遗憾这部分代码我已经没了,因为我最终换了另外一种方式来实现点击效果……因为这个方案对我的按键处理流程来说……有一些冲突的地方。