我正在使用SwiftUI和Redux,我想在显示的视图更新时添加一点动画,即应用程序以加载视图开始,然后在用我的API加载数据后,它被主视图替换,在这个替换过程中,我想动画显示一个黑色视图的出现和消失。
如果我可以在局部作用域上简单地做,我会这样做:
struct AppView: View {
@State private var loaded = false
@State private var isSwitchingView = false
var body: some View {
ZStack {
if loaded {
MainView()
} else {
LoadingView()
}
Color.black
.opacity(isSwitchingView ? 1 : 0)
}
}
.edgesIgnoringSafeArea(.all)
.onAppear {
Task {
// load() is an async function returning true if data is loaded correctly
let loadedResult = await load()
if loadedResult != loaded {
updateView(loadedResult: loadedResult)
}
}
}
}
func updateView(loadedResult: Bool) {
withAnimation(
.linear(duration: 0.25)
) {
isSwitchingView = true
}
delay(0.25) {
loaded = loadedResult
withAnimation(
.linear(duration: 0.25)
) {
isSwitchingView = false
}
}
}
}
我遇到的问题是,由于我使用的是redux,所以我在AppView
之外加载数据并更新预期的显示视图。
这是我的AppView在redux下的实际外观:
struct AppView: View {
@EnvironmentObject var store: Store<AppState>
var body: some View {
ZStack {
switch store.state.currentView {
case .loading:
AppLoadingView()
case .main:
MainView()
}
// how to animate this Color.black in that situation (when store.state.currentView changes)?
Color.black
}
.edgesIgnoringSafeArea(.all)
}
}
谢谢你的帮助!
1条答案
按热度按时间c2e8gylq1#
最后通过使用
.onChange(of: store.state.currentView)
使其工作