如何禁用 NavigationView 推送和弹出动画

kon*_*iki 20 swiftui swiftui-navigationlink swiftui-navigationview

鉴于这个简单NavigationView

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

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

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

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

.animation(nil)
Run Code Online (Sandbox Code Playgroud)
.transition(.identity)
Run Code Online (Sandbox Code Playgroud)
.transaction { t in t.disablesAnimations = true }
Run Code Online (Sandbox Code Playgroud)
.transaction { t in t.animation = nil }
Run Code Online (Sandbox Code Playgroud)

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

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

FRI*_*DAY 19

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"))
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用“UINavigationBar.setAnimationsEnabled(false)”似乎是 Xcode 14 和“NavigationStack”的唯一解决方法。 (2认同)

mal*_*hal 17

iOS 和 iPadOS 16.2 发行说明

\n

SwiftUI,新功能

\n
    \n
  • 通过将路径突变包装在 withTransaction(transaction) { \xe2\x80\xa6 } 中来禁用 NavigationStack 推送和弹出的动画,其中 transaction 将disablesAnimations 设置为 true。(88993253)
  • \n
\n

早期的iOS

\n

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

\n
struct ContentView : View {\n    @State var isActive = false\n    \n    var body: some View {\n        NavigationView {\n            VStack {\n                NavigationLink(isActive: $isActive, destination: {\n                    Text("PUSHED VIEW")}) {\n                    Text("Push Me")\n                }\n                Button("Navigate Without Animation") {\n                    var transaction = Transaction()\n                    transaction.disablesAnimations = true\n                    withTransaction(transaction) {\n                        isActive = true\n                    }\n                }\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


sup*_*cio 5

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")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PushViewPopView是两个允许您推送和弹出视图的视图(类似于 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

在此输入图像描述

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