落格输入法 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),你需要做额外的点击过滤,由于点击效果的传递实现五花八门,这里就不做深入展开了。


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

查看所有标签

猜你喜欢:

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

C语言进阶

C语言进阶

牟海军 / 机械工业出版社 / 2012-7 / 59.00元

C语言是编程语言中的一朵奇葩,虽已垂垂老矣,但却屹立不倒,诞生了数十年,仍然是最流行的编程语言之一。C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入的解读,揭露了C语言中那些鲜为普通开发者所知的秘密,旨在让读者真正掌握C语言,从而编写出更高质量......一起来看看 《C语言进阶》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具