【问题标题】:How to combine shapes in SwiftUI?如何在 SwiftUI 中组合形状?
【发布时间】:2020-04-18 23:37:14
【问题描述】:

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

这是我想要的:

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

【问题讨论】:

    标签: path swiftui shapes


    【解决方案1】:

    您可以像这样使用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
        }
    }
    

    并像这样使用它:

    struct SwiftUIView: View {
        var body: some View {
            CustomShape()
        }
    }
    

    【讨论】:

    • 这不是你正在创建的 Shape 的实现,你正在创建一个视图
    • @NicolasMandica 是正确的,但对我来说并不明显的是您可以访问和修改 SwiftUI 的内置 Shape 路径。要结合矩形和圆形,在路径闭合中:let rectangle = Rectangle().path(in: rect) .applying(CGAffineTransform(scaleX: 1, y: 0.5)) var circle = Circle().path(in: rect) circle.addPath(rectangle) path = circle
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多