在SwiftUI中从一个视图过渡到另一个视图

hgc7kmma  于 2023-04-10  发布在  Swift
关注(0)|答案(2)|浏览(120)

我有一个相当基本的设置,但过渡似乎不工作。理想的结果是淡出加载和淡入内容。一旦2秒结束,isLoading设置为false,它立即加载ContentView,没有动画过渡。
结构MyApp:App { @State private var isLoading = true

var body: some Scene {

    WindowGroup {
        ZStack {
            if isLoading {
                LoadingView()
                    .transition(.opacity)
                    .animation(.easeOut(duration: 2.0), value: isLoading)
            } else {
                ContentView()
                    .transition(.opacity)
                    .animation(.easeIn(duration: 2.5), value: isLoading)

            }
        }
        .onAppear {
            startApp()
        }
    }
}

private func startApp() {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        isLoading = false
    }
}

}
我尝试了几种不同的方法,尽管这段代码似乎是最可行的解决方案。

lkaoscv7

lkaoscv71#

你应该考虑更换

.transition(.opacity)
.animation(.easeIn(duration: 2.5), value: isLoading)

通过

.transition(AnyTransition.opacity.animation(.easeInOut(duration: 2.0)))
ffscu2ro

ffscu2ro2#

animation是视图animate的方式,而不是transit的方式,这就是为什么它一开始就不起作用。
1.要求父视图设置动画

ZStack {
    if isLoading {
        ProgressView()
            .transition(.opacity)
    } else {
        Text("ContentView")
            .transition(.opacity)
    }
}
.animation(.easeOut(duration: 2.0), value: isLoading)

1.停止转换视图

ProgressView()
    .opacity(isLoading ? 1 : 0)
    .animation(.easeOut(duration: 2.0), value: isLoading)
Text("ContentView")
    .opacity(isLoading ? 0 : 1)
    .animation(.easeOut(duration: 2.0), value: isLoading)

相关问题