UIFeedbackGenerator是什么?
UIFeedbackGenerator 是iOS提供的一组API,方便我们为应用增增触觉反馈(Haptic Feedback),从而为用户提供更多真实且细腻的交互体验。这种反馈可以帮助:
1、让按下按钮时有按压感;
2、让发生重大事件时有振动提示;
3、让滚动时有“咔”的反馈,增进操控感;
4、赋予应用更多“真实”的反馈环。
UIFeedbackGenerator的作用
现代移动应用中,触觉反馈可以显著地增进整体体验:
1、让操作有更多“真实感”,增大沉浸感。
2、为重大操作提供附加反馈,帮助用户确认。
3、为无障碍和有障碍的人提供更多感官线索。
比如:
用户“按下”购买按钮时,可以提供轻微振动,增大按下感。
用户收到一条通知时,可以用不同振动进行反馈。
主要子类
1、UIImpactFeedbackGenerator
作用:
为发生重大碰撞时提供反馈,如:
1、检票时“咔”的一声。
2、付费时“咚”的一声。
3、失败时“咣”的一声。
// 1. 创建发生器,指定样式
let generator = UIImpactFeedbackGenerator(style: .medium)
// 2. 预准备(建议在发生之前)
generator.prepare()
// 3. 发生反馈
generator.impactOccurred()
样式:
UIImpactFeedbackGenerator.FeedbackStyle:
// .light
// .medium
// .heavy
// .soft
// .rigid
2、UINotificationFeedbackGenerator
作用:
为重大通知提供不同反馈:
比如:
1、任务失败时“警告”。
2、任务成功时“确认”。
// 1. 创建发生器
let generator = UINotificationFeedbackGenerator()
// 2. 预准备
generator.prepare()
// 3. 发生反馈
generator.notificationOccurred(.error) // 错误
// generator.notificationOccurred(.success) // 成功
// generator.notificationOccurred(.warning) // 警告
3、UISelectionFeedbackGenerator
作用:
为滚动时发生的小增量提供反馈:
比如:
每滚到一条时发生“咔”的反馈。
// 1. 创建发生器
let generator = UISelectionFeedbackGenerator()
// 2. 预准备
generator.prepare()
// 3. 发生反馈
generator.selectionChanged()
使用技巧
建议重复利用发生器:
比如:
let impactGenerator = UIImpactFeedbackGenerator(style: .medium)
let notificationGenerator = UINotificationFeedbackGenerator()
let selectionGenerator = UISelectionFeedbackGenerator()
若每时刻重复new一个发生器:
可能导致消耗资源。
发生时有一定延迟。
建议准备好再发生:
generator.prepare()
// 需要时再发生
generator.impactOccurred()
这样可以减少发生时的延迟。
实际用例
import SwiftUI
struct ContentView: View {
var body: some View {
Button("发生触觉反馈") {
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.prepare()
generator.impactOccurred()
}
}
}
还可以复用UIImpactFeedbackGenerator,而不是每次按下时都去重复创建。
这样有以下优点:
1、减少资源消耗。
2、反馈发生时更加灵敏(因为你可以事先准备好发生器)。
import SwiftUI
struct ContentView: View {
// 复用发生器,建议放在 View 中进行复用
private let generator = UIImpactFeedbackGenerator(style: .medium)
var body: some View {
Button("发生触觉反馈") {
// 事先准备好发生器(可以为发生做好准备)
generator.prepare()
// 发生反馈
generator.impactOccurred()
}
}
}
这样可以在重复使用时,无需重复初始化。
总结
UIFeedbackGenerator提供了方便且优雅地为 App 增增触觉反馈的方法。
可以增加更多 “真实感”、“反馈”、“可信赖感”、“趣味性”和“沉浸感”。
这种反馈是无声且直观地为用户传达信息,与 UI 本身高度结合。