如何解决带有 switch 语句的 SwiftUI 动画
我了解 SwiftUI 中的简单动画是如何工作的。但是,我有一个稍微复杂的 watchOS 应用程序。视图状态由 switch
语句处理:
struct ContentView: View {
@EnvironmentObject private var state: AppState
@State private var selection = 1
var body: some View {
Group {
switch state.view {
case .start:
TabView(selection: $selection) {
ActivityView()
.tag(0)
StartView()
.tag(1)
SettingsView()
.tag(2)
}
case .workout:
TabView(selection: $selection) {
TakeoffControlView()
.tag(0)
TakeoffView()
.tag(1)
}
}
// ...
}
}
}
在另一个视图中,我编辑了视图状态:
struct StartView: View {
@EnvironmentObject private var state: AppState
var body: some View {
Button(action: {
state.view = .workout
},label: {
Text("Start")
})
}
}
如何添加动画以在不同情况之间进行转换?我尝试向 Group
、TabView
和单个视图添加动画,但没有成功。显然我在 withAnimation
中包装了状态更改。但是,我无法使其正常工作。任何想法如何使这项工作?
解决方法
.transition()
只是定义了过渡是什么,要获得预期的过渡动画,您必须在 SourceOfTruth
块内对 withAnimation() { ... }
进行更改。
struct ContentView: View {
@EnvironmentObject private var state: AppState
@State private var selection = 1
var body: some View {
Group {
switch state.view {
case .start:
TabView(selection: $selection) {
ActivityView()
.tag(0)
StartView()
.tag(1)
SettingsView()
.tag(2)
}
.transition(.slide)//<- here
case .workout:
TabView(selection: $selection) {
TakeoffControlView()
.tag(0)
TakeoffView()
.tag(1)
}
.transition(.slide)//<- here
}
// ...
}
}
}
struct StartView: View {
@EnvironmentObject private var state: AppState
var body: some View {
Button(action: {
withAnimation(.easeIn) { //<- here
state.view = .workout
}
},label: {
Text("Start")
})
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。