如何在 SwiftUI 中组合形状?

Ant*_*vič 7 path shapes swiftui

我需要从几个其他形状创建一个形状,理想情况下,我会在最后得到一个单一的形状结构,它会像 ZStack 那样堆叠两个形状。我在任何地方都没有注意到这个明显的实现,所以也许有人对如何实现它有一些想法?

这就是我想要的:

struct CustomShape: Shape {
    func path(in rect: CGRect) -> Path {
        // Add shapes here???? For example, combine Rectangle with Circle?
    }
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ica 8

您可以使用这样func addPath(_ path: Path, transform: CGAffineTransform = .identity)创建一个新的:Shape

struct CustomShape: Shape {
    func path(in rect: CGRect) -> Path {
        var customShape = Path { p in
            p.move(to: CGPoint(x: 0, y: 0))
            p.addQuadCurve(to: CGPoint(x: 0, y: 100),
                           control: CGPoint(x: 0, y: 0))
            p.addCurve(to: CGPoint(x: 100, y: 400),
                       control1: CGPoint(x: 0, y: 200),
                       control2: CGPoint(x: 100, y: 200))
            p.addCurve(to: CGPoint(x: 200, y: 100),
                       control1: CGPoint(x: 100, y: 200),
                       control2: CGPoint(x: 200, y: 200))
            p.addQuadCurve(to: CGPoint(x: 200, y: 0),
                           control: CGPoint(x: 200, y: 0))
        }

        let rectangle = Rectangle()
            .path(in: customShape.boundingRect)
            .offsetBy(dx: 100, dy: 0)

        customShape.addPath(rectangle, transform: .init(scaleX: 0.5, y: 0.35))

        return customShape
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

struct SwiftUIView: View {
    var body: some View {
        CustomShape()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @NicolasMandica 是正确的,但对我来说不明显的是您可以访问和修改 SwiftUI 的内置 Shape 路径。要组合矩形和圆形,请在路径闭包中: ```let矩形 = 矩形().path(in: rect) .applying(CGAffineTransform(scaleX: 1, y: 0.5)) var Circle = Circle().path(在:矩形)circle.addPath(矩形)路径=圆``` (2认同)