SwiftUI:VStack 中视图上有阴影?

问题描述 投票:0回答:2

我有以下代码:

struct ViewA: View {
        
    var body: some View {
        Rectangle()
            .fill(Color(.yellow))
    }
}
    
struct ViewB: View {
        
    var body: some View {
        Rectangle()
            .fill(Color(.white))
    }
}
    
struct ViewC: View {
        
    var body: some View {
        Rectangle()
            .fill(Color(.blue))
    }
}


struct TestView: View {


    var body: some View {
        
        GeometryReader { geo in
            
            
            VStack(spacing: 0) {
                
                ViewA()
                    .frame(width: geo.size.width, height: geo.size.width/4, alignment: .center)
                    .shadow(color: .black, radius: 10, x: 0, y: 10)
                
                ViewB()
                
                ViewC()
                    .frame(width: geo.size.width, height: 100, alignment: .center)
                    .shadow(color: .black, radius: 10, x: 0, y: 0)
                    .opacity(0.8)
                
            }
            
        }
    }
}

它画:

enter image description here

底部蓝底白字视图(ViewC 覆盖 ViewB)的阴影出现。 我希望黄色视图 (ViewA) 在白色视图上投射阴影。

我希望白色视图看起来就像位于顶视图(黄色)和底视图(蓝色)下方。

我不知道如何组织视图,以便顶视图也会在中间视图上留下阴影。

我该如何实现这个目标?

swift swiftui shadow
2个回答
3
投票

您可以将 zindex 修饰符应用于 ViewA。例如.zIndex(.infinity)。它将把 ViewA 置于一切之上。 https://developer.apple.com/documentation/swiftui/view/zindex(_:)


1
投票

如果将视图放在

ZStack
中,其中 ViewB 位于 ViewA 和 ViewC 后面,您将看到阴影:

GeometryReader { geo in
    ZStack {
        ViewB()
        VStack(spacing: 0) {
            ViewA()
                .frame(
                    width: geo.size.width,
                    height: geo.size.width/4,
                    alignment: .center)
                .shadow(
                    color: .black,
                    radius: 10,
                    x: 0, y: 0)
            Spacer()
            ViewC()
                .frame(
                    width: geo.size.width,
                    height: 100,
                    alignment: .center)
                .shadow(
                    color: .black,
                    radius: 10,
                    x: 0, y: 0)
                .opacity(0.8)
        }
    }
}

screenshot

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.