Для iPhone 7/7 Plus или новее используйте эти три API-интерфейса обратной связи Haptic.
Доступные API
Для уведомлений:
let generator = UINotificationFeedbackGenerator()
generator.notificationOccured(style: .error)
Доступностили .error
, .success
и .warning
.У каждого есть свое отличительное чувство.
Из документов :
Конкретный подкласс UIFeedbackGenerator
, который создает тактику для сообщения об успехах, неудачах и предупреждениях.
Дляпростые вибрации:
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccured()
Доступные стили: .heavy
, .medium
и .light
.Это простые вибрации с различной степенью "твердости".
Из документов :
Конкретный подкласс UIFeedbackGenerator
, который создает тактильные ощущения для имитации физических воздействий
Когда пользователь выбралitem
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
Это наименее заметный из всех тактильных ощущений, и поэтому он наиболее подходит для случаев, когда тактильные гаджеты не должны воспринимать опыт приложения.
Из документов :
Конкретный подкласс UIFeedbackGenerator
, который создает тактильные детали для указания изменения в выборе.
Примечания
Есть несколько моментов, которые стоит запомнить при использовании этих API.
Примечание A
Вы на самом деле не создаете тактильный. Вы запроссистема генерирует тактильную тактику.Система решит, основываясь на следующем:
- Если возможны неприятные ощущения на устройстве (имеет ли он в данном случае Taptic Engine)
- Может ли приложение записывать звук (тактильные данныене генерировать во время записи для предотвращения нежелательных помех)
- Включены ли тактильные параметры в настройках системы.
Таким образом, система будет молча игнорировать ваш запрос о тактильном, если это невозможно.Если это связано с неподдерживаемым устройством, вы можете попробовать это:
func haptic() {
// Get whether the device can generate haptics or not
// If feedbackSupportLevel is nil, will assign 0
let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int ?? 0
switch feedbackSupportLevel {
case 2:
// 2 means the device has a Taptic Engine
// Put Taptic Engine code here, using the APIs explained above
case 1:
// 1 means no Taptic Engine, but will support AudioToolbox
// AudioToolbox code from the myriad of other answers!
default: // 0
// No haptic support
// Do something else, like a beeping noise or LED flash instead of haptics
}
Подставьте комментарии в операторах switch
- case
, и этот код тактильной генерации будет переносимым на другие устройства iOS.Он будет генерировать максимально возможный уровень тактильности.
Примечание B
- Из-за того, что генерация тактильных сигналов является задачей hardware , может возникнутьзадержка между тем, когда вы вызываете код тактильной генерации, и когда он действительно происходит. По этой причине все API-интерфейсы Taptic Engine имеют метод
prepare()
, чтобы поместить его всостояние готовности.Используя пример Game Over: вы можете знать, что игра заканчивается, потому что у пользователя очень низкий уровень здоровья или рядом с ними опасный монстр. - Если вы не генерируете тактильный сигнал в течение нескольких секунд, Taptic Engine вернется в состояние ожидания (для экономии заряда батареи)
В этом случаеподготовка Taptic Engine создала бы более качественный и более отзывчивый опыт.
Например, допустим, ваше приложение использует распознаватель панорамирования для изменения видимой части мира.Вы хотите, чтобы тактильный генератор генерировался, когда пользователь «смотрит» вокруг 360 градусов.Вот как вы можете использовать prepare()
:
@IBAction func userChangedViewablePortionOfWorld(_ gesture: UIPanGestureRecogniser!) {
haptic = UIImpactFeedbackGenerator(style: .heavy)
switch gesture.state {
case .began:
// The user started dragging the screen.
haptic.prepare()
case .changed:
// The user trying to 'look' in another direction
// Code to change viewable portion of the virtual world
if virtualWorldViewpointDegreeMiddle = 360.0 {
haptic.impactOccured()
}
default:
break
}