Медленные кнопки с пользовательским расширением клавиатуры

Мы сделали пользовательскую клавиатуру и загрузили в App Store, дизайн и клавиатура работают отлично. Однако мы получаем много 1-звездочных обзоров из-за медлительности кнопок. Вопрос в том. Есть ли способ ускорить UIButtons вверх?

UIControl-х touchUpInside работает, когда пользователь отпускает палец с кнопки, в некоторых случаях люди пишут так быстро и touchUpInside не "быстрый" способ сделать это

TouchDown будет стрелять раньше TouchUpInside потому что касание - это действие касания пальцем телефона.

Посоветуйте пожалуйста, что и каким способом вы обычно предпочитаете для производственной клавиатуры

Это мой текущий метод обработки крана: который слишком медленный!

func buttonAction(_ sender:UIButton!) {
        print("Button tapped")
       self.textDocumentProxy.insert("B")
}

1 ответ

Решение

Скорость 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.insert(self.currentTitle!)}

Я сделал это и получил скорость как оригинальная клавиатура

Другие вопросы по тегам