iOS Haptic Обратная связь не срабатывает
Я работаю с некоторыми UIGestures (в частности, принудительное прикосновение). У меня все это работает, дополнительные обновления / анимации пользовательского интерфейса работают на принудительное касание. Тем не менее, я хотел бы добавить в тактильной обратной связи на жесткой прессе. К моему ужасу, этот фрагмент кода не работает. Функция вызывается, интерфейс обновляется, но нет тактильной обратной связи. Есть что-то, чего я здесь не хватает? Разрешения, возможности и т. Д.?
@objc func forceTouchHandler(_ sender: ForceTouchGestureRecognizer) {
print("force touch")
UINotificationFeedbackGenerator().notificationOccurred(.success)
self.updateInterface()
}
Заранее спасибо за любые отзывы.
5 ответов
Итак, я немного покопался, но, похоже, проблема была в том, что я тестировал iPhone 6, который не поддерживает UINotificationFeedbackGenerator
, Я полагал, что, поскольку они обеспечивают тактильные прикосновения к этому, и никакие ошибки не были выброшены, все было правильно в мире.
Итак, вот что я сделал:
let modelName = UIDevice.modelName
if audioModels.contains(modelName) {
AudioServicesPlaySystemSound(1519)
} else {
UINotificationFeedbackGenerator().notificationOccurred(.success)
}
UIDevice.modelName
это просто вспомогательная функция, которую я нашел в интернете (проб. стек), которая получает имя устройства. Затем я сравниваю это имя с небольшим массивом, который я настроил - audioModels
- устройств, которые должны воспроизводить звук вместо использования NotificationFeedbackGenerator
, Не уверен, что есть лучший, более интуитивно понятный способ проверки работоспособности для каждого устройства (дайте мне знать, если есть), но это работает для меня.
Еще раз спасибо за рассмотрение вопроса.
Вам не нужно никакого разрешения на использование генератора обратной связи. Это не будет работать, когда вы используете микрофон. Но в других случаях все должно быть хорошо. Попробуйте позвонить prepare()
метод до уведомления.
let generator = UINotificationFeedbackGenerator()
generator.prepare()
generator.notificationOccurred(.success)
Для меня проблема заключалась в том, что тактильные ощущения были отключены на системном уровне.
Настройки -> Звуки и тактильные сигналы -> Системные тактильные сигналы
Убедитесь, что это включено.
После этого поста для работы Haptic Engine нам понадобится следующее:
- Устройство должно работать под управлением iOS 10.0 или более поздней версии.
- Устройство должно быть iPhone 7 или более поздней версии.
- Haptic Engine должен быть включен в настройках устройства.
Вы пытаетесь сделать сенсорную обратную связь, поэтому
UIImpactFeedbackGenerator().impactOccurred()
было бы более уместно.
Для старых устройств вы можете использовать:
AudioServicesPlaySystemSound(1519)
Подводя итог и отдавая должное Марси, вот что работает в iOS 13+:
import CoreHaptics
import AudioToolbox
func touchFeedback() {
if CHHapticEngine.capabilitiesForHardware().supportsHaptics {
UIImpactFeedbackGenerator().impactOccurred()
} else {
AudioServicesPlaySystemSound(1519) // 1520 and 1521 are gradually stronger
}
}
Для дополнительного контроля,UIImpactFeedbackGenerator
имеет 5 стилей, по умолчанию.light
, но есть и.soft
,.medium
,.heavy
,.rigid
. Вы получаете их в инициализаторе, например:
UIImpactFeedbackGenerator(style: .rigid).impactOccurred()
Если тактильная обратная связь не включена в настройках iPhone, вы можете использовать AudioServicesPlaySystemSound или AudioServicesPlayAlertSound , чтобы в любом случае получить вибрацию.
Я провел расследование и обнаружил только следующие типы звука, вызывающие вибрацию:
1519, 1520, 1521, kSystemSoundID_Vibrate
Пример:AudioServicesPlaySystemSound(1521)
,AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
Примечание. 1352 совпадает с kSystemSoundID_Vibrate.