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

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

内容简介:最近更新: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),你需要做额外的点击过滤,由于点击效果的传递实现五花八门,这里就不做深入展开了。


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

查看所有标签

猜你喜欢:

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

网络空间导论

网络空间导论

李良荣、方师师 / 复旦大学出版社 / 2018-6-1 / 38

在互联网蓬勃发展的今天,新闻传播学科该往何处去?在长达半个多世纪的深入研究后,李良荣教授及其团队给出了答案:从“小新闻”走向“大传播”,并撰写了这本开创性的教材:《网络空间导论》。 在本书中,互联网被定义为“空间”——持续演进的数字化现实。为了深刻把握网络空间的内涵,本书提供了六个维度的观察:技术应用、组织架构、政治经济、媒介文化、网络素养、安全治理,并以大胆且富有建设性的观点重新定义了新闻......一起来看看 《网络空间导论》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

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

HEX CMYK 互转工具