Медленные кнопки с пользовательским расширением клавиатуры
Мы сделали пользовательскую клавиатуру и загрузили в 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!)}
Я сделал это и получил скорость как оригинальная клавиатура