在SwiftUI中,如何设置已发布视图更改的动画?
我想设置视图更改的动画。在SwiftUI中,如何设置已发布视图更改的动画?,swift,swiftui,Swift,Swiftui,我想设置视图更改的动画。 特别是,我做了一个视图,其中一个子视图是一个不断变化的视图 struct MasterView: View { @State var playerLeft: Bool = false @ObservedObject var viewModel: MasterViewModel var body: some View { ZStack { WaitPlayerBackView(isShowing: sel
特别是,我做了一个视图,其中一个子视图是一个不断变化的视图
struct MasterView: View {
@State var playerLeft: Bool = false
@ObservedObject var viewModel: MasterViewModel
var body: some View {
ZStack {
WaitPlayerBackView(isShowing: self.$playerLeft) {
self.viewModel.currentView
}
}
}
}
视图模型是一个ObservieObject类。currentView由从异步线程调用的方法更改,如下所示:
class MasterViewModel: ObservableObject {
@Published var currentView: AnyView = AnyView(EmptyView())
func changeView() {
self.currentView = AnyView(NightView())
}
}
它就像Android片段的副本(请原谅进行比较)。如何设置此视图更改的动画?
我尝试过不同的选择,如:
self.viewModel.currentView.animate(.default)
或
但是,它们都不起作用。这就是我在更改currentView实例时看到的转换。
将视图初始化移动到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()
}
}
此动画是否由您的
playerLeft
控制?否,playerLeft控制WaitPlayerBackView的可见性,WaitPlayerBackView是一个带有活动指示器的加载视图。我需要设置currentView的动画,它在运行时会发生变化。好的,这很有效,非常感谢!我想您在这里放错了两个括号:。transition(AnyTransition.opacity)。animation((duration:1.0))。我放了一个索引而不是Bool,因为我有更多的视图可供选择。因此,我将currentView更改为Int。我还将.animation(.none)添加到所有不想设置动画的子视图中。
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()
}
}