Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SwiftUI中,如何设置已发布视图更改的动画?_Swift_Swiftui - Fatal编程技术网

在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()
    }
}