问题
在开发落格输入法的过程中,我就一直被一个问题所困扰,那就是当用户点击在屏幕左侧边缘时, UIButton 的 touchDown event 几乎变成了 touchUpInside 。也就是说,这两个同时发生,而当你仅按下的时候, touchDown 不再被调用要等到你抬起手指的那一瞬间,才触发 touchDown 。 这在键盘上就很明显了,按键音、按键视觉提示和震动提示都因此而延后,在连续输入的时候,一旦遇到屏幕左侧边缘的 Q 键,则明显要感觉键入流程卡顿一下。 这个问题其实是由于 3D Touch 切换多任务以及从屏幕边缘向右滑动返回的手势导致的。由于这两者是 iOS 系统全局的,所以我们很难绕过这一上游 bug。甚至在 iPhone X 系列的全面屏里,键盘的这个问题不但没有得到改进,反而变成了屏幕两边都延迟的情况。
App 里的解决办法
这个错误由来已久,但直到 iOS 11,才勉强算是有了解决办法: preferredScreenEdgesDeferringSystemGestures: UIRectEdge的你需要在你的 ViewController 中重写这个变量,让你的 app 优先级高于系统手势即可。
1 2 3 |
override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge { return [.top,.left,.right,.bottom] } |
键盘里的配置方案
上文中提出的办法,在键盘扩展中是无法生效的——因为并没有权限。为此,我做了一个 UIButton 的子类,并在其中使用 func point(inside point: CGPoint, with event: UIEvent?) -> Bool 这个方法来判断用户点击,它的优势是不论用户点击到哪里,都会第一时间被触发。
1 2 3 |
if super.point(inside: point, with: event), event?.type == UIEvent.EventType.touches { sendActions(for: UIControl.Event.touchDown) } |
本文由 落格博客 原创撰写:落格博客 » 落格输入法 X 是如何处理屏幕边缘延迟问题的
转载请保留出处和原文链接:https://www.logcg.com/archives/3094.html
您好,能提供這個UIButton子類的部份代碼嗎?
很遗憾这部分代码我已经没了,因为我最终换了另外一种方式来实现点击效果……因为这个方案对我的按键处理流程来说……有一些冲突的地方。