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

时间:2019-08-01 09:08:23

标签: swiftui

给出以下简单的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中找到任何有用的东西:-(

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

2 个答案:

答案 0 :(得分:2)

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

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")
            }
        }
    }
}

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

结果是:

enter image description here

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

答案 1 :(得分:1)

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"))
            }
        }
    }
}