我有一个相当基本的设置,但过渡似乎不工作。期望的结果是淡出加载和淡出内容。一旦2秒结束,isLoading被设为false,它就会立即加载ContentView,没有动画过渡。
struct 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
}
}
}
我尝试了几种不同的方法,但这段代码似乎是最可行的解决方案。
你应该考虑替换
.transition(.opacity)
.animation(.easeIn(duration: 2.5), value: isLoading)
.transition(AnyTransition.opacity.animation(.easeInOut(duration: 2.0)))
animation
是如何查看animate
的,而不是transit
的,这就是为什么它首先不起作用。有许多方法可以修复代码,例如
- 请求父视图动画
ZStack {
if isLoading {
ProgressView()
.transition(.opacity)
} else {
Text("ContentView")
.transition(.opacity)
}
}
.animation(.easeOut(duration: 2.0), value: isLoading)
- 停止传输视图
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)