SwiftUI:如何在父视图更改时优雅地过渡?
SwiftUI: How do I transition gracefully when parent view changes?
我有一个像这样开始设置的视图。
var body: some View {
switch appState.userFlow {
case .onboarding:
Text("Not Yet Implemented")
case .login:
LandingPageView()
case .home:
HomeScreenView()
}
}
在每个 userFlow
中,我都会使用 @EnvironmentObject
更改 appState 每当对象更改其状态时,视图就会闪烁并显示新视图。就目前而言,这看起来既突兀又丑陋。
我试图按照这个思路做一些事情。这没有效果。在这种情况下处理转换的正确方法是什么?
LandingPageView().transition(.opacity)
需要将 .transition
应用于要切换的视图 的 容器,因此您需要嵌入 switch
在 Group
、VStack
或类似内容中。
此外,您需要在容器上有一个 .animation(.default)
,或者在 withAnimation {}
块中更改 appState.userFlow
以实际动画更改。
enum UserFlow {
case onboarding
case login
case home
}
struct ContentView: View {
@State var userFlow = UserFlow.home
var body: some View {
/// container
Group {
switch userFlow {
case .onboarding:
Text("Not Yet Implemented")
case .login:
Text("Login page")
case .home:
Text("Home page")
}
}
.animation(.default) /// also need Animation
.transition(.opacity)
/// for testing
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
userFlow = .login
}
}
}
}
结果:
我有一个像这样开始设置的视图。
var body: some View {
switch appState.userFlow {
case .onboarding:
Text("Not Yet Implemented")
case .login:
LandingPageView()
case .home:
HomeScreenView()
}
}
在每个 userFlow
中,我都会使用 @EnvironmentObject
更改 appState 每当对象更改其状态时,视图就会闪烁并显示新视图。就目前而言,这看起来既突兀又丑陋。
我试图按照这个思路做一些事情。这没有效果。在这种情况下处理转换的正确方法是什么?
LandingPageView().transition(.opacity)
需要将 .transition
应用于要切换的视图 的 容器,因此您需要嵌入 switch
在 Group
、VStack
或类似内容中。
此外,您需要在容器上有一个 .animation(.default)
,或者在 withAnimation {}
块中更改 appState.userFlow
以实际动画更改。
enum UserFlow {
case onboarding
case login
case home
}
struct ContentView: View {
@State var userFlow = UserFlow.home
var body: some View {
/// container
Group {
switch userFlow {
case .onboarding:
Text("Not Yet Implemented")
case .login:
Text("Login page")
case .home:
Text("Home page")
}
}
.animation(.default) /// also need Animation
.transition(.opacity)
/// for testing
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
userFlow = .login
}
}
}
}
结果: