【问题标题】:SwiftUI custom animated transition in navigationView?NavigationView 中的 SwiftUI 自定义动画过渡?
【发布时间】:2020-04-03 20:56:05
【问题描述】:

在 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

【问题讨论】:

  • 目前还没有官方自定义标准NavigationView动画的方法,但是可以创建自定义导航。您可能会发现我在此 post 中提供的方法很有帮助。那里有要求的幻灯片动画,但实际上它可以与任何一个重新打包。
  • 嗨@Asperi,您链接帖子中的方法是我用作解决方法的方法。我创建了自己的 NavigationView - 非常接近您在那里提供的方式。

标签: swiftui swiftui-navigationlink


【解决方案1】:

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

我需要更改不透明度,但我无法使用 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{} 结构来模拟转换。

希望有帮助!

【讨论】:

  • 对我来说,使用导航链接的全部意义在于防止出现这样的视图。这个视图,如果你想用很多其他的视图来扩展它,将会包含太多关于应用程序结构的信息。因此,即使这是一个可行的折衷方案,它也不会帮助大多数决定使用导航视图的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多