前言
说到触觉反馈,很多开发者应该都不陌生。也许你早已经在你的App中使用过。虽然你已经使用过,但是我们再来回忆一下吧
两种反馈系统的差别
系统提供了两种反馈系统。
- UINotificationFeedbackGenerator
- UIImpactFeedbackGenerator
两者有区别,但也有联系。
在SwiftUI中,UINotificationFeedbackGenerator和UIImpactFeedbackGenerator都是用于给用户提供轻触反馈(haptic feedback)的机制。它们的主要区别和共同点如下:
区别:
- UINotificationFeedbackGenerator用于notification反馈,时长短,通常用于提示成功、警告等事件。
- UIImpactFeedbackGenerator用于impact反馈,感觉较重,通常用于模拟物理碰撞等效果。
共同点:
- 都是通过触觉来提供无声反馈,不影响音频播放。
- 可以控制震动强度(light、medium、heavy)。
- 支持在主线程调用,不会卡顿界面。
- 调用prepare()来预加载效果,避免实时计算延迟。
- 需要检查设备是否支持haptic feedback。
如何使用
我们对系统提供的方法进行简单的封装,以便于我们方便调用。我们会以单利的形式来管理 Haptic
UINotificationFeedbackGenerator 使用
UINotificationFeedbackGenerator 使用很简单,只需要传入对应的枚举值,便可调用产生效果。 它有三个枚举类型,定义如下:
extension UINotificationFeedbackGenerator {
public enum FeedbackType : Int, @unchecked Sendable {
case success = 0
case warning = 1
case error = 2
}
}
方法封装
func notification(type: UINotificationFeedbackGenerator.FeedbackType) {
let generator = UINotificationFeedbackGenerator()
generator.prepare()
generator.notificationOccurred(type)
}
使用
Button("error") { HapticManager.instance.notification(type: .error) }
Button("success") { HapticManager.instance.notification(type: .success) }
Button("warning") { HapticManager.instance.notification(type: .warning) }
UIImpactFeedbackGenerator
UIImpactFeedbackGenerator 拥有五个参数,也是枚举值 定义如下:
extension UIImpactFeedbackGenerator {
public enum FeedbackStyle : Int, @unchecked Sendable {
case light = 0
case medium = 1
case heavy = 2
@available(iOS 13.0, *)
case soft = 3
@available(iOS 13.0, *)
case rigid = 4
}
}
方法封装
func impact(style: UIImpactFeedbackGenerator.FeedbackStyle) {
let generator = UIImpactFeedbackGenerator(style: style)
generator.prepare()
generator.impactOccurred()
}
使用
Button("soft") { HapticManager.instance.impact(style: UIImpactFeedbackGenerator.FeedbackStyle.soft) }
Button("light") { HapticManager.instance.impact(style: UIImpactFeedbackGenerator.FeedbackStyle.light) }
Button("medium") { HapticManager.instance.impact(style: UIImpactFeedbackGenerator.FeedbackStyle.medium) }
Button("rigid") { HapticManager.instance.impact(style: UIImpactFeedbackGenerator.FeedbackStyle.rigid) }
Button("heavy") { HapticManager.instance.impact(style: UIImpactFeedbackGenerator.FeedbackStyle.heavy) }
使用Haptic可以让用户在特殊情况下,能感知自己确实点击了屏幕。有利于提升用户体验,好了。就这么多,快快用起来吧
如果你觉得写的不错,就分享,评论,点赞吧。
大家有什么看法呢?欢迎留言讨论。 公众号:RobotPBQ