SwiftUI:自定义形状 material 填充不起作用

SwiftUI: Custom shape material fill does not work

我使用以下代码在 SwiftUI 中制作了自定义形状:

struct CustomShape: Shape {
    func path(in rect: CGRect) -> Path {
        var path = Path()
    
        path.move(to: CGPoint(x: rect.minX, y: rect.maxY))
        path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
        path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
        path.addQuadCurve(to: CGPoint(x: 0, y: rect.minY), control: CGPoint(x: rect.midX, y: rect.minY - 25))
    
        return path
    }
}

这个形状的用法如下:

CustomShape()
    .fill(.ultraThickMaterial)
    .frame(height: 200)

问题是,如果我尝试用一​​种颜色填充它,效果会很好。如果我尝试用 material 填充它,只有矩形似乎被填充,弧形部分保持白色:

你知道如何解决这个问题吗?

当您使用 material 时似乎正在应用剪裁,但当您使用颜色时却没有。您的路径弧线延伸到视图框架之外。

您可以通过将路径完全包含在形状的 rect 参数中来解决此问题:

func path(in rect: CGRect) -> Path {
    var path = Path()
        
    path.move(to: CGPoint(x: rect.minX, y: rect.maxY))
    path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
    path.addLine(to: CGPoint(x: rect.maxX, y: rect.minY + 25))
    path.addQuadCurve(to: CGPoint(x: 0, y: rect.minY + 25), control: CGPoint(x: rect.midX, y: rect.minY))
    path.closeSubpath()
    return path
}

如果您确实希望 material 延伸到框架之外,那么您需要使用某种容器视图。

我想说 backgroundclipShape 应该能达到预期的效果(假设 CustomShape 构造正确)

这是一个演示以提高可见性(使用 Xcode 13.3 / iOS 15.4 测试)

Image("background").overlay(
    Rectangle()
         .background(.thinMaterial)   // << here !! (thin for demo)
         .frame(height: 200)
         .clipShape(CustomShape())    // << here !!
    )