如何在SwiftUI中有条件地设置视图转换?

时间:2020-05-21 01:08:47

标签: ios swift swiftui

这是我的情况。我有3个子视图的根视图。在根视图中,我有两种状态:

@State private var currentView = "home"
@State private var priorView = "home"

对于每个子视图,我传递当前视图和先前视图的绑定,以便子视图中的按钮可以修改它们。请注意,该按钮将currentView设置为我们要导航到的按钮:

struct ViewB: View {
    @Binding var currentView: String
    @Binding var priorView: String

    var body: some View {
        VStack {
            SettingsView()
            Button(action: {
                withAnimation {
                    self.currentView = "viewA"
                    self.priorView = "viewB"
                }
            }) {
                Text("Go Home")
            }
        }
    }
}

现在返回到根视图,我有一些条件逻辑来管理当前显示的子视图:

@ViewBuilder
var body: some View {
    VStack{
        if currentView == "viewA" {
            if priorView == "viewB" || priorView == currentView {
                ViewA(currentView: $currentView, priorView: $priorView)
                .transition(.move(edge: .bottom))
            }
            if priorView == "viewC" {
                ViewA(currentView: $currentView, priorView: $priorView)
            }
        } else if currentView == "viewB" {
            ViewB(currentView: $currentView, priorView: $priorView)
            .transition(.move(edge: .top))
        } else if currentView == "viewC" {
            ViewC(currentView: $currentView, priorView: $priorView)
            .transition(.move(edge: .bottom))
        }
    }
}

ViewA是起点,它有两个按钮。一种前往ViewB,另一种前往ViewB。当用户转到ViewB时,我希望它向下滑动,因为ViewA也会向下滑动到视图之外。当用户转到ViewC时,我希望它向上滑动,因为View A也向上滑动。效果就好像它们像这样位于滚动条上一样:

ViewB

|

ViewA

|

查看C

问题是,当应用首次加载时(例如,priorView == currentView),无法知道用户首先要行驶的方向,因此我们不知道该怎么做应该指定转换,我们不知道视图应该向哪个方向移动。因此,当用户从A-> B移开时,转换是错误的。但是,如果它们继续在A和B之间来回切换,则过渡是完美的。现在,如果用户从A-> C转到,则转换又是错误的。但是,如果它们继续在A和C之间来回移动,则动画是完美的。

TLDR; :发生触发时如何将过渡应用于视图,因此我能够根据其他条件决定其方向?

0 个答案:

没有答案