简体   繁体   English

在 SwiftUI 中,如何为已发布视图更改设置动画?

[英]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.

相关问题 属性更改 SwiftUI 的动画视图 - Animate view on property change SwiftUI 如何更改 SwiftUI 应用程序(无 SceneDelegate 或 AppDelegate)中的根视图? - How can I change the root view in a SwiftUI app (no SceneDelegate or AppDelegate)? SwiftUI 如何临时为视图颜色的foregroundColor 设置动画? - SwiftUI how do I temporarily animate a view color's foregroundColor? SwiftUI:您能否动画化数据本身的变化,而不仅仅是视图对变化的响应? - SwiftUI: Can you animate a change in data itself, not just a view's response to the change? 您可以为 SwiftUI 视图制作动画吗? - Can you animate a SwiftUI View on disappear? 如何在 SwiftUI 中从文本字段设置动画到列表行? - How can I animate from textfield to list row In SwiftUI? SwiftUI - 从一个视图更改 @Published 变量并让它反映在另一个视图中 - SwiftUI - Change an @Published var from one view and have it reflect on another SwiftUI:如何从一个视图更改索引并在另一个视图中显示正确的文本? - SwiftUI : How can I change the index from a view and show the correct Text in another view? 使用 RealmSwift 和 SwiftUI,如何查看视图中的记录并同时更改它,而不会弹出视图? - Using RealmSwift and SwiftUI, how can I look at a record in the view and change it simultaneously, without view poping out? 为什么我在 SwiftUI 中更改了他后发布的 Array 没有更改? - Why published Array does not change after I change him in SwiftUI?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM