Swiftui 快捷界面,多个形状,统一阴影?

Swiftui 快捷界面,多个形状,统一阴影?,swiftui,shadow,shapes,Swiftui,Shadow,Shapes,在SwiftUI中有没有一种方法可以合并两个形状,以便它们投射出统一的阴影。我尝试过各种组合和修饰,但似乎无法达到我想要的效果。如有任何见解,将不胜感激 struct CardView: View { var body: some View { Group { RoundedRectangle(cornerRadius: 20) .fill(Color.orange) .frame(w

在SwiftUI中有没有一种方法可以合并两个形状,以便它们投射出统一的阴影。我尝试过各种组合和修饰,但似乎无法达到我想要的效果。如有任何见解,将不胜感激

struct CardView: View {
    var body: some View {
        Group {
            RoundedRectangle(cornerRadius: 20)
                .fill(Color.orange)
                .frame(width: 200, height: 250)
                .zIndex(0)
            Circle()
                .trim(from: 0.5, to: 1)
                .fill(Color.orange)
                .frame(width: 100, height: 100)
                .offset(y: -125)
                .zIndex(1)
        }.shadow(color: Color.black, radius: 10, x: 0, y: 0)
    }
}
这是我得到的,也是我追求的


注意:
zIndex
只是我尝试过的东西,即两个形状具有相同的
zIndex
等。这也是一种快速重新排序的方法,无需在容器中移动形状。

这里是可能的解决方案。使用Xcode 11.4/iOS 13.4进行测试


我认为正确的答案是@Asperi的
.compositingGroup
,如本文所述(),但我想留下一个不同的工作版本,因为在某些用例中,您可能无法或希望使用
.compositingGroup

让我们看一下
.background
,您可以复制并粘贴代码以在模拟器中查看:

import SwiftUI

struct AnyShapedView: View {
    var body: some View {
        ZStack {
            RoundedRectangle(cornerRadius: 20)
                .fill(Color.orange)
                .frame(width: 200, height: 250)
                .zIndex(0)
            Circle()
                .trim(from: 0.5, to: 1)
                .fill(Color.orange)
                .frame(width: 100, height: 100)
                .offset(y: -125)
                .zIndex(1)
        }
    }
}

struct ContentView: View {
    var body: some View {
        AnyShapedView()
        .background(
            AnyShapedView()
            .shadow(color: Color.black, radius: 10, x: 0, y: 0)
        )
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
输出:


上面的版本不是最佳实践,但是,尽管如此,请尝试了解形状和裁剪是如何工作的,因为在某些用例中,它可能会很有用。

感谢@punkbit花时间解释,感谢您的见解,每一种意见都很有帮助,非常感谢。还有苹果文档中的compositinggroup链接,非常有用,谢谢。是的,你的问题实际上对很多用例都很有用,所以我也留下了这个例子:)
import SwiftUI

struct AnyShapedView: View {
    var body: some View {
        ZStack {
            RoundedRectangle(cornerRadius: 20)
                .fill(Color.orange)
                .frame(width: 200, height: 250)
                .zIndex(0)
            Circle()
                .trim(from: 0.5, to: 1)
                .fill(Color.orange)
                .frame(width: 100, height: 100)
                .offset(y: -125)
                .zIndex(1)
        }
    }
}

struct ContentView: View {
    var body: some View {
        AnyShapedView()
        .background(
            AnyShapedView()
            .shadow(color: Color.black, radius: 10, x: 0, y: 0)
        )
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}