SwiftUI:无法在MainView中将DetailView过渡到ZStack

时间:2020-04-26 18:15:14

标签: swift animation swiftui transition z-index

我在任何地方都找不到答案,希望你们中的一个能帮助我。

我有一个包含一些内容的MainView。按下按钮,我想打开一个DetailView。我正在使用ZStack在顶部将DetailView分层,以填充屏幕。

但是使用以下代码,我无法使其正常工作。 DetailView插入时没有过渡,并且在移除时停止。我尝试过手动和不手动设置zIndex以及自定义assymetricalTransition。无法解决这个问题。有什么办法吗?

//MainView
@State var showDetail: Bool = false

var body: some View {
    ZStack {
        VStack {
            Text("Hello MainWorld")
            Button(action: {
                withAnimation(.spring()) {
                    self.showDetail.toggle()
                }
            }) {
                Text("Show detail")
            }
        }


        if showDetail {
            ContentDetail(showDetail: $showDetail)
                .transition(.move(edge: .bottom))
        }
    }
    .edgesIgnoringSafeArea(.all)
}

这是DetailView:

//DetailView

@Binding var showDetail: Bool    

var body: some View {
    VStack (spacing: 25) {
        Text("Hello, DetailWorld!")

        Button(action: { withAnimation(.spring()) {
            self.showDetail.toggle()
            }

        }) {
            Text("Close")
        }
        .padding(.bottom, 50)


    }
    .frame(width: UIScreen.main.bounds.width,
           height: UIScreen.main.bounds.height)
    .background(Color.yellow)
    .edgesIgnoringSafeArea(.all)

}

这段代码的结果是这样的: enter image description here

我正在运行Xcode 11.4.1,因此隐式动画似乎也不起作用。真的卡在这里,希望你们中的一个能帮助我!谢谢:)

1 个答案:

答案 0 :(得分:1)

这是一个解决方案。已通过Xcode 11.4 / iOS 13.4测试。

demo

struct MainView: View {
    @State var showDetail: Bool = false

    var body: some View {
        ZStack {
            Color.clear // extend ZStack to all area
            VStack {
                Text("Hello MainWorld")
                Button(action: {
                        self.showDetail.toggle()
                }) {
                    Text("Show detail")
                }
            }

            if showDetail {
                DetailView(showDetail: $showDetail)
                    .transition(AnyTransition.move(edge: .bottom))
            }
        }
        .animation(Animation.spring())  // one animation to transitions
        .edgesIgnoringSafeArea(.all)
    }
}

struct DetailView: View {
    @Binding var showDetail: Bool

    var body: some View {
        VStack (spacing: 25) {
            Text("Hello, DetailWorld!")

            Button(action: {
                self.showDetail.toggle()
            }) {
                Text("Close")
            }
            .padding(.bottom, 50)


        }
        .frame(maxWidth: .infinity, maxHeight: .infinity) // fill in container
        .background(Color.yellow)
    }
}