задержка при нажатии кнопки гарнитуры в iphone
Я пытаюсь вызвать различные действия внутри только моего собственного приложения, используя кнопки подключенной гарнитуры (что-то похожее на то, что делает pressy). Однако я заметил, что независимо от того, использую ли я MPRemoteCommandCenter
или remoteControlReceivedWithEvent
делегат, я получаю события с заметным отставанием. Что еще хуже, если я попробую быстро нажать кнопку двойного нажатия, я получу только один UIEventTypeRemoteControl
.
кто-нибудь испытывает подобную проблему, знает причину этого или даже лучше знает некоторые обходные пути? Испытано под ios8 и iOS 9 охота.
1 ответов
быстрое двойное нажатие-это действительно однопользовательское действие, так как это желаемое поведение практически в любом приложении, которое использует управление гарнитурой для ввода. Это экономит разработчиков, имеющих для дебоунса, очереди и разбора входящих событий управления вручную и хорошая вещь (tm)!
для этого система введет небольшое количество задержки, пока она ждет дальнейшего ввода пользователем. Для этого потребуется всего несколько сотен миллисекунд, после чего вы получите событие в вашем коде.
длинный, болезненный, но, надеюсь, полезный пример обнаружения двойного нажатия:
- пользователь нажимает на управление гарнитурой
- системные уведомления нажмите, ждет выпуска
- пользователь выпускает управление гарнитурой
- выпуск системных уведомлений, обнаруживает, что кнопка времени была удержана (длительное нажатие против короткого нажатия) и очереди одно нажатие событие
- система ждет 200ms в случае, если это двойное нажатие
- это! Пользователь нажимает на управление гарнитурой
- системные уведомления нажмите, ждет выпуска
- пользователь выпускает управление гарнитурой
- система преобразует событие с одним нажатием в очередь в событие с двойным нажатием
- система ждет 200ms в случае, если это тройное нажатие
- нет пользовательского ввода в течение 200 мс
- система запускает событие двойного нажатия и очищает очередь
посмотреть, как задержка необходима для один/двойной/тройной пресс обнаружение.
когда событие достигнет вашего приложения, у него будет подтип, который описывает, какой тип клика сделал пользователь:
let rc = event!.subtype
print("received remote control \(rc.rawValue)") // 101 = pause, 100 = play
switch rc {
case .RemoteControlTogglePlayPause:
// ..
case .RemoteControlPlay:
// ..
case .RemoteControlPause:
// ..
default:break
}
ответ на аналогичный вопрос указал, что эти целые числа кода события будут чем-то вроде;
100 = play
101 = pause
103 = single mic click
104 = double mic click
105 = triple mic click
etc ...