21

鉴于这个简单NavigationView

struct ContentView : View {
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink("Push Me", destination: Text("PUSHED VIEW"))
            }
        }
    }
}

NavigationView当目标视图被推入/弹出堆栈时,有没有人找到一种禁用动画的方法?

从 iOS2.0 开始,这在 UIKit 中已经成为可能!我认为从框架中要求并不过分。NavigationView我在所有视图(即容器、目标视图、NavigationLink等)上尝试了各种修饰符

这些是我尝试过的一些修饰符:

.animation(nil)
.transition(.identity)
.transaction { t in t.disablesAnimations = true }
.transaction { t in t.animation = nil }

没有任何改变。我没有发现任何有用的东西EnvironmentValues:-(

我是否遗漏了一些非常明显的东西,或者功能还不存在?

4

3 回答 3

20

Xcode 11.3:

现在没有修改器来禁用NavigationView动画。

您可以使用您的结构init()来禁用动画,如下所示:

struct ContentView : View {

    init(){
        UINavigationBar.setAnimationsEnabled(false)
    }

    var body: some View {
        NavigationView {
            VStack {
                NavigationLink("Push Me", destination: Text("PUSHED VIEW"))
            }
        }
    }
}
于 2019-12-25T19:40:55.303 回答
4

swiftui-navigation-stack我最近创建了一个名为( https://github.com/biobeats/swiftui-navigation-stack )的开源项目,其中包含NavigationStackView一个模仿标准导航行为的视图,NavigationView添加了一些有用的功能。例如,您可以NavigationStackView按照 Kontiki 在问题中的要求使用和禁用过渡动画。当您创建时,NavigationStackView只需指定.nonetransitionType

struct ContentView : View {
    var body: some View {
        NavigationStackView(transitionType: .none) {
            ZStack {
                Color.yellow.edgesIgnoringSafeArea(.all)

                PushView(destination: View2()) {
                    Text("PUSH")
                }
            }
        }
    }
}

struct View2: View {
    var body: some View {
        ZStack {
            Color.green.edgesIgnoringSafeArea(.all)
            PopView {
                Text("POP")
            }
        }
    }
}

PushView并且PopView是允许您推送和弹出视图的两个视图(类似于 SwiftUI NavigationLink)。这是完整的示例:

import SwiftUI
import NavigationStack

struct ContentView : View {
    var body: some View {
        NavigationStackView(transitionType: .none) {
            ZStack {
                Color.yellow.edgesIgnoringSafeArea(.all)

                PushView(destination: View2()) {
                    Text("PUSH")
                }
            }
        }
    }
}

struct View2: View {
    var body: some View {
        ZStack {
            Color.green.edgesIgnoringSafeArea(.all)
            PopView {
                Text("POP")
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

结果是:

在此处输入图像描述

如果你们能和我一起改进这个开源项目,那就太好了。

于 2020-02-04T15:41:27.663 回答
3

首先,您需要状态NavigationLink来响应,然后在禁用动画的事务中设置该状态,如下所示:

struct ContentView : View {
    @State var isActive = false
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(isActive: $isActive, destination: {
                    Text("PUSHED VIEW")}) {
                    Text("Push Me")
                }
                Button("Navigate Without Animation") {
                    var transaction = Transaction()
                    transaction.disablesAnimations = true
                    withTransaction(transaction) {
                        isActive = true
                    }
                }
            }
        }
    }
}
于 2021-12-09T16:19:40.310 回答