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

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

touchUpInside UIControl работает, как только пользователь убирает палец с кнопки, в некоторых случаях люди пишут так быстро, а touchUpInside не является «быстрым» способом сделать это.

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

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

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

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

person Community    schedule 01.04.2018    source источник
comment
Клавиатура Apple по умолчанию регистрирует клавишу при касании. Но на iPhone, если вторая клавиша нажата, когда первая нажата, тогда первая клавиша регистрируется и не ждет ее касания. Это сохраняет ввод в порядке касания вниз. Ваша клавиатура так работает?   -  person vacawama    schedule 01.04.2018
comment
Да, @vacawama.   -  person    schedule 01.04.2018
comment
Имейте в виду, что нажатая клавиша должна сначала зарегистрировать предыдущую.   -  person Jakub Truhlář    schedule 01.04.2018


Ответы (2)


Скорость 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
    }
}
person vacawama    schedule 01.04.2018

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

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

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

person Awais Mobeen    schedule 11.09.2019