[英]In SwiftUI how can I animate a Published View change?
I would like to animate a View change.我想为视图更改设置动画。
In particular, I have done a View where one of its children is a changing View.特别是,我做了一个视图,其中一个子视图是变化的视图。
struct MasterView: View {
@State var playerLeft: Bool = false
@ObservedObject var viewModel: MasterViewModel
var body: some View {
ZStack {
WaitPlayerBackView(isShowing: self.$playerLeft) {
self.viewModel.currentView
}
}
}
}
The view model is an ObservableObject class.视图 model 是一个 ObservableObject class。 currentView is changed by a method called from an async thread, like this: currentView 由从异步线程调用的方法更改,如下所示:
class MasterViewModel: ObservableObject {
@Published var currentView: AnyView = AnyView(EmptyView())
func changeView() {
self.currentView = AnyView(NightView())
}
}
It's like a copy of Android fragments (pardon the comparison).这就像 Android 片段的副本(请原谅比较)。
How can I animate this View change?如何为这个视图更改设置动画?
I have tried different options like:我尝试了不同的选择,例如:
self.viewModel.currentView.animate(.default)
or或者
struct MasterView: View {
@State var playerLeft: Bool = false
@ObservedObject var viewModel: MasterViewModel
var body: some View {
ZStack {
WaitPlayerBackView(isShowing: self.$playerLeft) {
self.viewModel.currentView
}
}.animate(self.viewModel.animate ? .easeIn(duration: 1) : .none)
}
}
class MasterViewModel: ObservableObject {
@Published var currentView: AnyView = AnyView(EmptyView())
@Published var animate = false
func changeView() {
self.animate = false
self.currentView = AnyView(NightView())
self.animate = true
}
}
However, none of them worked.然而,他们都没有工作。
This is how I see a transition when changing the instance of currentView.这就是我在更改 currentView 的实例时看到的过渡。
Moving your view initialization to MasterView makes everything easier:将视图初始化移动到 MasterView 使一切变得更容易:
struct MasterView: View {
@State var playerLeft: Bool = false
@ObservedObject var viewModel: MasterViewModel
var body: some View {
ZStack {
VStack { //this represents WaitPlayerBackView
if viewModel.day { //here are the posibles views that self.viewModel.currentView could have
Text("DayView").transition(AnyTransition.opacity.animation(.easeInOut(duration: 1.0)))
} else {
Text("NightView").transition(AnyTransition.opacity.animation(.(duration: 1.0)))
}
}
}
}
}
class MasterViewModel: ObservableObject {
@Published var day: Bool = false
init () {
_ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(changeView), userInfo: nil, repeats: true) //Only for testing
}
@objc func changeView() { //@objc is only for testing
day.toggle()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.