触觉反馈在iOS中的运用

959 阅读2分钟

前言

说到触觉反馈,很多开发者应该都不陌生。也许你早已经在你的App中使用过。虽然你已经使用过,但是我们再来回忆一下吧

两种反馈系统的差别

系统提供了两种反馈系统。

  1. UINotificationFeedbackGenerator
  2. 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