讲讲 SwiftUI 中新增的感官反馈 API

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

SwiftUI 在 iOS 17 引入了新的 sensoryFeedback 视图修饰器,允许我们在所有 Apple 平台上使用触觉反馈,触觉反馈就是你在点击某个按钮或者其他操作时系统给出的反馈,使用起来非常简单。今天来讲讲如何使用 sensoryFeedback 修饰符为我们应用程序中的不同操作提供触觉反馈。

sensoryFeedback

在 SwiftUI 视图中使用触觉反馈所需要做的就是附加带有两个参数的 sensoryFeedback 视图修饰器。

go 复制代码
struct ContentView: View {
    @State var bool = false
    var body: some View {
        VStack {
            Button {
                print("点击了按钮")
                bool.toggle()
            } label: {
                Text("点我!")
            }
            .sensoryFeedback(.success, trigger: bool)
        }
        .padding()
    }
}

sensoryFeedback 修饰器有两个参数,第一个是反馈的类型,这里我填写的是成功反馈,第二个参数 trigger 是一个 Equatable 的泛型,代表触发值,只要这个值有变化,就会有反馈。

其他类型

SwiftUI 提供了一堆预定义的反馈样式,比如

  • success,成功反馈,适用于 iOS 和 watchOS

  • warning,警告反馈,适用于 iOS 和 watchOS

  • error,错误反馈,适用于 iOS 和 watchOS

  • selection,选择反馈,适用于 watchOS

  • decrease,减少反馈,适用于 watchOS

  • start,开始反馈,适用于 watchOS

  • stop,停止反馈,适用于 watchOS

  • alignment,对齐反馈,适用于 macOS

  • levelChange,级别更改反馈,适用于 macOS

  • impact,影响反馈,适用于 iOS 和 watchOS

除了这些预设类型之外,还可以通过 impact 方法来自定义反馈,比如我们自定义一个中等权重和强度为 0.5 的反馈:

php 复制代码
struct ContentView: View {
    @State var bool = false
    var body: some View {
        VStack {
            Button {
                print("点击了按钮")
                bool.toggle()
            } label: {
                Text("点我!")
            }
            .sensoryFeedback(.impact(weight: .medium, intensity: 0.5), trigger: bool)
        }
        .padding()
    }
}

其他使用方式

sensoryFeedback API 还提供了更灵活的方式,便于不同的应用场景,比如你需要根据不同的场景来展示不同的反馈:

sql 复制代码
struct ContentView: View {
    @State var isSucceeded = false
    var body: some View {
        VStack {
            Button {
                print("点击了按钮")
                isSucceeded.toggle()
            } label: {
                Text("点我!")
            }
            .sensoryFeedback(trigger: isSucceeded) { old, new in
                return new ? .success : .error
            }
        }
        .padding()
    }
}

上边的代码中,我们定义了一个 isSucceeded 的 Bool 值来代表成功或者失败,在 sensoryFeedback 函数中如果成功了就展示成功反馈,如果失败了就展示失败反馈。

另外也可以通过另一个 sensoryFeedback 的变体来灵活的控制是否需要反馈:

swift 复制代码
struct ContentView: View {
    @State var isSucceeded = false
    var body: some View {
        VStack {
            Button {
                print("点击了按钮")
                isSucceeded.toggle()
            } label: {
                Text("点我!")
            }
            .sensoryFeedback(.error, trigger: isSucceeded) { oldValue, newValue in
                return newValue == false
            }
        }
        .padding()
    }
}

这个例子展示了只有失败的情况下才展示失败反馈。

不得不说,SwiftUI 的新功能既强大,又方便,唯一不友好的是 iOS 17 及以上才能使用,项目中真正用上还要再过几年。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
陈皮话梅糖@6 小时前
iOS 集成ffmpeg
ios·ffmpeg
幽夜落雨6 小时前
ios老版本应用安装方法
ios
胖虎114 小时前
实现 iOS 自定义高斯模糊文字效果的 UILabel(文末有Demo)
ios·高斯模糊文字·模糊文字
_可乐无糖2 天前
Appium 检查安装的驱动
android·ui·ios·appium·自动化
胖虎12 天前
iOS 网络请求: Alamofire 结合 ObjectMapper 实现自动解析
ios·alamofire·objectmapper·网络请求自动解析·数据自动解析模型
开发者如是说3 天前
破茧英语路:我的经验与自研软件
ios·创业·推广
假装自己很用心3 天前
iOS 内购接入StoreKit2 及低与iOS 15 版本StoreKit 1 兼容方案实现
ios·swift·storekit·storekit2
iOS阿玮3 天前
“小红书”海外版正式更名“ rednote”,突然爆红的背后带给开发者哪些思考?
ios·app·apple
刘小哈哈哈3 天前
iOS UIScrollView的一个特性
macos·ios·cocoa
忆江南的博客4 天前
iOS 性能优化:实战案例分享
ios