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

栏目: IOS · 发布时间: 7年前

内容简介:最近更新:22nd 九月, 2018在开发落格输入法的过程中,我就一直被一个问题所困扰,那就是当用户点击在屏幕左侧边缘时,这在键盘上就很明显了,按键音、按键视觉提示和震动提示都因此而延后,在连续输入的时候,一旦遇到屏幕左侧边缘的

最近更新:22nd 九月, 2018

问题

在开发落格输入法的过程中,我就一直被一个问题所困扰,那就是当用户点击在屏幕左侧边缘时, UIButton touchDown event 几乎变成了 touchUpInside 。也就是说,这两个同时发生,而当你仅按下的时候, touchDown 不再被调用要等到你抬起手指的那一瞬间,才触发 touchDown

这在键盘上就很明显了,按键音、按键视觉提示和震动提示都因此而延后,在连续输入的时候,一旦遇到屏幕左侧边缘的 Q 键,则明显要感觉键入流程卡顿一下。

这个问题其实是由于 3D Touch 切换多任务以及从屏幕边缘向右滑动返回的手势导致的。由于这两者是 iOS 系统全局的,所以我们很难绕过这一上游 bug。

甚至在 iPhone X 系列的全面屏里,键盘的这个问题不但没有得到改进,反而变成了屏幕两边都延迟的情况。

App 里的解决办法

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

override var preferredScreenEdgesDeferringSystemGestures: UIRectEdge {<br />
        return [.top,.<em>left</em>,.<em>right</em>,.<em>bottom</em>]<br />
    }

键盘里的配置方案

上文中提出的办法,在键盘扩展中是无法生效的——因为 并没有权限 。为此,我做了一个 UIButton 的子类,并在其中使用 func point ( inside point : CGPoint , with event : UIEvent ? ) -> Bool 这个方法来判断用户点击,它的优势是不论用户点击到哪里,都会第一时间被触发。

if super.point(inside: point, with: event), event?.type == UIEvent.EventType.touches {
            sendActions(for: UIControl.Event.touchDown)
        }

当判定点击的是当前 Button 时,我们手动触发 touchDown 调用。

这样不论用户点击到哪里,键盘都可以在第一时间正确响应了——但是,新的问题随之而来,由于点击本身也会产生 touchDown ,所有的正常点击就都变成了两份(或多份,连续的 touchDown 已经让 event 变成了 touchDownRepeat),你需要做额外的点击过滤,由于点击效果的传递实现五花八门,这里就不做深入展开了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

浪潮之巅(下册)

浪潮之巅(下册)

吴军 / 人民邮电出版社 / 2013-6 / 45.00元

《浪潮之巅(第2版)(下册)》不是一本科技产业发展历史集,而是在这个数字时代,一本IT人非读不可,而非IT人也应该阅读的作品。一个企业的发展与崛起,绝非只是空有领导强人即可达成。任何的决策、同期的商业环境,都在都影响着企业的兴衰。《浪潮之巅》不只是一本历史书,除了讲述科技顶尖企业的发展规律,对于华尔街如何左右科技公司,以及金融风暴对科技产业的冲击,也多有着墨。此外,《浪潮之巅》也着力讲述很多尚在普......一起来看看 《浪潮之巅(下册)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具