Swift 迅捷:Can';在主视图中,无法将DetailView转换为ZStack

Swift 迅捷:Can';在主视图中,无法将DetailView转换为ZStack,swift,animation,swiftui,transition,z-index,Swift,Animation,Swiftui,Transition,Z Index,我在任何地方都找不到这个问题的答案,希望你们中的一个能帮助我 我有一个包含一些内容的主视图。按下一个按钮,我想打开一个DetailView。我正在使用ZStack将DetailView分层到顶部,填充屏幕 但是使用下面的代码,我无法让它工作。DetailView在插入时没有转换,在删除时停止。我尝试过手动设置zIndex,也尝试过不手动设置zIndex,以及自定义的assymetricalTransition。不能让它工作。有什么解决办法吗 //MainView @State var showD

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

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

但是使用下面的代码,我无法让它工作。DetailView在插入时没有转换,在删除时停止。我尝试过手动设置zIndex,也尝试过不手动设置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

@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)

}
此代码的结果如下:


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

这里有一个解决方案。使用Xcode 11.4/iOS 13.4进行测试


谢谢你的回复。我之前已经试过了,但是使用这个解决方案,DetailCard会立即转到后台,如果我尝试使用zIndex(1)手动将其设置到前台,应用程序就会崩溃。有什么想法吗?@Wood,我不知道什么是
DetailCard
——没有这样的观点。正如您在演示中看到的,对于两个方向的转换,DetailView都位于顶部,这就是为什么我没有使用zIndex,但是,无论如何,如果您添加我的代码
DetailView(showDetail:$showDetail)。transition(AnyTransition.move(edge:.bottom))。zIndex(1)
将不会崩溃。对不起,我是指DetailView,我的错。如果您使用慢速动画运行初始答案,或者将颜色设置为.white而不是.clear,则该答案是可见的。使用.zIndex(1)修饰符,第一次按下按钮时效果良好,但如果再快速按下,应用程序将崩溃。仅供参考,Asperi的答案对我有效,只要您在注释中设置了上述zIndex。如果其他人遇到碰撞,Wood正在描述我的修复方法,它将我的高Z索引视图置于我的
body
属性中的其他视图之上。
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)
    }
}