带有自定义键盘扩展的慢速按钮
Slow Buttons with Custom Keyboard Extension
我们制作了一个自定义键盘并上传到 App Store,设计和键盘都很好用。然而,由于按钮速度慢,我们得到了很多 1 星评价。问题是。有没有办法加快 UIButtons
的速度?
UIControl 的 touchUpInside
在用户将手指从按钮上松开后工作,在某些情况下,人们写得很快,touchUpInside
不是 "Fast" 的方式
TouchDown
将在 TouchUpInside
之前触发,因为触地是手指触及 phone 的动作。
请就此提出建议,您通常更喜欢生产键盘的哪种方式
这是我目前处理点击的方法:太慢了!
func buttonAction(_ sender:UIButton!) {
print("Button tapped")
self.textDocumentProxy.insert("B")
}
TouchDown 与 TouchUpInside 的速度并不是真正的问题。当用户用两个拇指打字并且按键顺序被错误解释时,问题就来了。
Apple 的默认键盘会在触摸时注册一个键。但是,在 iPhone 上,如果在第一个键按下时按下第二个键,那么第一个键就会被注册并且不会等待它的触摸。这使输入保持按下顺序(对于两个拇指键入),但仍然反映了触摸行为。
要实现这一点,您需要同时观察 TouchDown 和 TouchUpInside 事件。
这是您可以做到的一种方法。创建一个名为 pendingButton
的 属性 来跟踪按下的最后一个按钮,并在该按钮松开或按下另一个按钮时处理该按钮。
您需要将 buttonDown
连接到 TouchDown 事件,将 buttonUp
连接到 TouchUpInside 事件。
// last button pressed down
var pendingButton: String?
// connect button TouchDown events here
@IBAction func buttonDown(_ sender: UIButton) {
// If we already have a pending button, process it before storing
// the next one
if let pending = self.pendingButton {
self.textDocumentProxy.insert(pending)
}
self.pendingButton = sender.currentTitle
}
// connect button TouchUpInside events here
@IBAction func buttonUp(_ sender: UIButton) {
// If the button being let up is the latest pending button,
// then process it, otherwise ignore it
if sender.currentTitle == self.pendingButton {
self.textDocumentProxy.insert(self.currentTitle!)
self.pendingButton = nil
}
}
注意:您可能还需要仔细考虑其他事件,例如 TouchUpOutside。这可能也应该连接到 buttonUp
,具体取决于您键盘的所需行为。
如果相反,在按钮外部拖动会取消按钮,那么您应该实现一个函数来观察 TouchDragExit,然后取消待定按钮(如果它是待定按钮)。
// connect button TouchDragExit events here
@IBAction func dragExit(_ sender: UIButton) {
if sender.currentTitle == self.pendingButton {
self.pendingButton = nil
}
}
加速使用调度队列的最简单方法
DispatchQueue.main.async {
self.textDocumentProxy.insertText(self.currentTitle!)}
我这样做了,速度和原来的键盘一样
我们制作了一个自定义键盘并上传到 App Store,设计和键盘都很好用。然而,由于按钮速度慢,我们得到了很多 1 星评价。问题是。有没有办法加快 UIButtons
的速度?
UIControl 的 touchUpInside
在用户将手指从按钮上松开后工作,在某些情况下,人们写得很快,touchUpInside
不是 "Fast" 的方式
TouchDown
将在 TouchUpInside
之前触发,因为触地是手指触及 phone 的动作。
请就此提出建议,您通常更喜欢生产键盘的哪种方式
这是我目前处理点击的方法:太慢了!
func buttonAction(_ sender:UIButton!) {
print("Button tapped")
self.textDocumentProxy.insert("B")
}
TouchDown 与 TouchUpInside 的速度并不是真正的问题。当用户用两个拇指打字并且按键顺序被错误解释时,问题就来了。
Apple 的默认键盘会在触摸时注册一个键。但是,在 iPhone 上,如果在第一个键按下时按下第二个键,那么第一个键就会被注册并且不会等待它的触摸。这使输入保持按下顺序(对于两个拇指键入),但仍然反映了触摸行为。
要实现这一点,您需要同时观察 TouchDown 和 TouchUpInside 事件。
这是您可以做到的一种方法。创建一个名为 pendingButton
的 属性 来跟踪按下的最后一个按钮,并在该按钮松开或按下另一个按钮时处理该按钮。
您需要将 buttonDown
连接到 TouchDown 事件,将 buttonUp
连接到 TouchUpInside 事件。
// last button pressed down
var pendingButton: String?
// connect button TouchDown events here
@IBAction func buttonDown(_ sender: UIButton) {
// If we already have a pending button, process it before storing
// the next one
if let pending = self.pendingButton {
self.textDocumentProxy.insert(pending)
}
self.pendingButton = sender.currentTitle
}
// connect button TouchUpInside events here
@IBAction func buttonUp(_ sender: UIButton) {
// If the button being let up is the latest pending button,
// then process it, otherwise ignore it
if sender.currentTitle == self.pendingButton {
self.textDocumentProxy.insert(self.currentTitle!)
self.pendingButton = nil
}
}
注意:您可能还需要仔细考虑其他事件,例如 TouchUpOutside。这可能也应该连接到 buttonUp
,具体取决于您键盘的所需行为。
如果相反,在按钮外部拖动会取消按钮,那么您应该实现一个函数来观察 TouchDragExit,然后取消待定按钮(如果它是待定按钮)。
// connect button TouchDragExit events here
@IBAction func dragExit(_ sender: UIButton) {
if sender.currentTitle == self.pendingButton {
self.pendingButton = nil
}
}
加速使用调度队列的最简单方法
DispatchQueue.main.async {
self.textDocumentProxy.insertText(self.currentTitle!)}
我这样做了,速度和原来的键盘一样