12

SwiftUI 中有没有办法改变 NavigationView/NavigationLink 的标准行为,即从一个视图滑动到下一个视图?我想要一个自定义动画/过渡,比如淡入/淡出。

我现在正在尝试一段时间并解决了其中的一半,但下半部分却在苦苦挣扎。这段代码:

struct ContentView: View {
    @State var appeared: Double = 0.0

    var body: some View {
        NavigationView {
            VStack {
                Text("\(appeared)")
                NavigationLink(destination: ViewB()) {Text("go to View B")}
            }
            .opacity(appeared)
            .animation(Animation.easeInOut(duration: 3.0), value: appeared)
            .onAppear {self.appeared = 1.0}
            .onDisappear {self.appeared = 0.0}
        }
    }
}

当视图出现时工作正常。它通过在 3 秒内将不透明度更改为 1.0 来淡入。都好。但是当点击NavigationLink, 转到视图 B 时,它会滑开该视图,并且视图 B(具有相同的逻辑)会慢慢淡入。我想这是因为onDisappear实际上是在视图消失时触发的,而不是在它即将移开时触发。

是否有机会告诉 SwiftUI 不要滑动或滑动,而是进行自定义动画/过渡?

我正在使用 Xcode 11.2.1

4

1 回答 1

3

这有点晚了,但我刚刚遇到了这个问题,也许我的解决方案会帮助其他有这个问题的人。

我需要改变不透明度,但我不能用 NavLink 做到这一点,所以我做了这样的事情:

struct example: View {
    @State var firstView = true
    @State var appeared: Double = 0
    var body: some View {
        VStack{
            if firstView{
                VStack{
                    Button(action: {
                        self.firstView = false
                    }){
                        Text("change view")
                    }
                }
            }
            else{
                VStack{
                    Text("Hello, World!")
                }
                .opacity(appeared)
                .animation(Animation.easeInOut(duration: 3.0), value: appeared)
                .onAppear {self.appeared = 1.0}
                .onDisappear {self.appeared = 0.0}
            }
        }

    }
}

这个想法是,当按下按钮时(或者无论何时执行您需要执行的任何计算),您都可以使用 if-else{} 结构来模拟转换。

希望有帮助!

于 2020-04-01T00:33:42.380 回答