使用自定义键盘扩展时,按钮反应缓慢。

3
我们制作了一款定制键盘并上传到应用商店,设计和键盘功能都很好。然而,我们因按钮反应速度慢而收到很多1星评论。问题是:有没有办法加快 UIButtons 的速度?
UIControl 的 touchUpInside 在用户松开按钮后才起作用,在某些情况下,人们写得太快,而 touchUpInside 并不是最快的方式。
TouchDown 会在 TouchUpInside 之前触发,因为 TouchDown 是手指触摸手机的动作。
请就此提供建议,您通常喜欢使用哪种方式来制作生产键盘。
这是我目前处理轻击的方法:但是这个方法太慢了!
func buttonAction(_ sender:UIButton!) {
        print("Button tapped")
       self.textDocumentProxy.insert("B")
}

1
苹果的默认键盘在松开时会注册一个按键。但是,在iPhone上,如果第二个按键在第一个按下时被按下,则第一个按键会立即被注册,而不必等待其松开。这将保持输入的按下顺序。你的键盘是否也是这样工作的? - vacawama
是的,@vacawama。 - user9373173
请注意,按下的键应该先注册前一个。 - Jakub Truhlář
2个回答

4

加快使用调度队列的最简单方法

     DispatchQueue.main.async { 
       self.textDocumentProxy.insertText(self.currentTitle!)}

我这样做后,键盘速度与原始键盘一样快。

3
< p > TouchDownTouchUpInside的速度并不是问题。问题在于当用户用两个拇指打字时,按键被错误地解释的顺序。

苹果的默认键盘在抬起手指时注册一个按键。但是,在iPhone上,如果第一个按键按下时同时按下第二个按键,则第一个按键会立即注册,而不必等待抬起手指。这使得输入保持了触摸顺序(用于双拇指打字),但仍反映了抬起手指的行为。

要实现这一点,您需要观察TouchDownTouchUpInside事件。

以下是一种实现方法。创建一个名为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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接