根据背景应用阴影

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

我试图理解为什么在使用“透明”颜色与使用“蓝色”等非透明颜色时,将阴影应用于 SwiftUI 文本视图是不同的。

#Preview {
    VStack {
        Text("Blue box")
            .background(.blue)
            // adds drop shadow to the bounding rectangle
            .clipped()
            .shadow(color: .black, radius: 2)

        Text("Clear box")
            .background(.clear)
            // adds drop shadow to every letter
            .clipped()
            .shadow(color: .black, radius: 2)

        Spacer()
    }
    .background(.yellow)
    .padding()
}

上面的代码产生了这个

enter image description here

swiftui shadow
1个回答
0
投票

如果您注释掉修饰符

.clipped()
,那么蓝色版本中的字母也会有阴影,背景也会有阴影:

Text("Blue box")
    .background(.blue)
    // .clipped()
    .shadow(color: .black, radius: 2)

Screenshot

作为一般规则,如果您希望阴影位于背景周围,则需要将其应用于背景本身:

Text("Blue box")
    .background{
        Color.blue
            .shadow(color: .black, radius: 2)
    }
    // .clipped()

Screenshot

至于为什么

.clipped()
修改器对清晰版本没有影响,似乎修改器移动了背景后面字母的阴影。由于背景清晰,字母的阴影清晰可见。您可以通过将背景更改为半透明来确认这一点:

VStack(spacing: 20) {
    Text("Opacity 0.0")
        .background(.white.opacity(0.0))
        .clipped()
        .shadow(color: .black, radius: 2)
    Text("Opacity 0.1")
        .background(.white.opacity(0.1))
        .clipped()
        .shadow(color: .black, radius: 2)
    Text("Opacity 0.5")
        .background(.white.opacity(0.5))
        .clipped()
        .shadow(color: .black, radius: 2)
    Text("Opacity 1.0")
        .background(.white.opacity(1.0))
        .clipped()
        .shadow(color: .black, radius: 2)
    Spacer()
}
.background(.yellow)
.padding()

Screenshot

© www.soinside.com 2019 - 2024. All rights reserved.