Тактильная обратная связь iOS не срабатывает

Я работаю с некоторыми UIGestures (в частности с силовым касанием). У меня все это работает, дополнительные обновления / анимация пользовательского интерфейса работают на принудительное касание. Тем не менее, я хотел бы добавить тактильную обратную связь при жестком нажатии. К моему ужасу, этот фрагмент кода не работает. Функция вызывается, интерфейс обновляется, но тактильной обратной связи нет. Что-то мне здесь не хватает? Разрешения, возможности и т. Д.?

@objc func forceTouchHandler(_ sender: ForceTouchGestureRecognizer) {
    print("force touch")
    UINotificationFeedbackGenerator().notificationOccurred(.success)
    self.updateInterface()
}

Заранее благодарим за любые отзывы.


person djneely    schedule 21.09.2018    source источник
comment
Что такое ForceTouchGestureRecognizer и как оно работает?   -  person Yury Imashev    schedule 21.09.2018
comment
ForceTouchGestureRecognizer - это настраиваемый распознаватель жестов для обработки жестов принудительного касания. Все работает и стреляет нормально. Я попадаю в этот обработчик функции, и также вызывается метод self.updateInterface (). Единственное, что здесь не работает, - это тактильный отклик.   -  person djneely    schedule 23.09.2018
comment
Я уверен, что это работает. Но поскольку вы сказали, что в других случаях все работает нормально, я полагаю, что некоторые детали того, как в точности работает ForceTouchGestureRecognizer, возможно, могут объяснить, почему система игнорирует ваше уведомление об обратной связи.   -  person Yury Imashev    schedule 23.09.2018


Ответы (2)


Вам не нужно разрешение на использование генератора обратной связи. Это не сработает, если вы используете микрофон. Но в остальном все должно быть хорошо. Попробуйте вызвать prepare() метод перед уведомлением.

let generator = UINotificationFeedbackGenerator()
generator.prepare()
generator.notificationOccurred(.success)
person Yury Imashev    schedule 21.09.2018
comment
Спасибо, что ответили мне на этот вопрос. Я скопировал и вставил ваш код, но все равно не повезло. - person djneely; 21.09.2018

Итак, пришлось немного покопаться, но, похоже, проблема заключалась в том, что я тестировал iPhone 6, который не поддерживает UINotificationFeedbackGenerator. Я подумал, поскольку они обеспечивают тактильные ощущения, и не было выдано никаких ошибок, все в мире было правильно.

Итак, вот что я в итоге сделал:

let modelName = UIDevice.modelName
if audioModels.contains(modelName) {
    AudioServicesPlaySystemSound(1519)
} else {
    UINotificationFeedbackGenerator().notificationOccurred(.success)
}

UIDevice.modelName - это просто вспомогательная функция, которую я нашел в Интернете (пробный стек), которая получает имя устройства. Затем я сравниваю это имя с небольшим набором, который я установил - audioModels - устройств, которым необходимо воспроизводить звук вместо использования NotificationFeedbackGenerator. Не уверен, есть ли лучший, более интуитивный способ проверки функциональности на каждом устройстве (дайте мне знать, если он есть), но это работает для меня.

Еще раз спасибо за изучение проблемы.

person djneely    schedule 26.09.2018