这里每天分享一个 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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!