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 应用于要切换的视图 的 容器,因此您需要嵌入 switchGroupVStack 或类似内容中。

此外,您需要在容器上有一个 .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
            }
        }
    }
}

结果: