ios 插入(in:)函数

uqzxnwby  于 2022-11-26  发布在  iOS
关注(0)|答案(1)|浏览(131)

我尝试以固定的量插入路径,但由于某种原因,似乎无法正常工作。我做错了什么?
这很好用;它将绘制一个250 x250的矩形,并带有红色边框。

let frame = CGRect(origin: .zero, size: CGSize(width: 250, height: 250))

VStack {
    Path { path in
        path.addRect(frame)
    }
    .border(Color.red)
}.frame(width: frame.width, height: frame.height)

现在,我想插入任意数量的图形,比如说20。我假设我可以使用path(in:)方法来完成此操作,但这似乎不起作用。

let frame = CGRect(origin: .zero, size: CGSize(width: 250, height: 250))

VStack {
    Path { path in
        path.addRect(frame)
    }
    .path(in: frame.insetBy(dx: 20, dy: 20))
    .border(Color.red)
}.frame(width: frame.width, height: frame.height)

我以为看到的是一个230 x230的小矩形,边框是红色的,但实际上看到的是一个250 x250的矩形,边框是红色的。为什么会这样?我该如何正确应用插入?
PS:这个addRect(frame)函数当然可以写成addRect(frame.insetBy(dx: 20, dy: 20)),但是这里的rect是按照演示的。在实践中,我有一个包含几条线和几个点的路径,它不适用于insetBy(dx:dy:)函数

eyh26e7m

eyh26e7m1#

Path上使用inset的快速示例扩展:

extension Path {
    func insetBy(dx: CGFloat, dy: CGFloat) -> Path {
        let wMultiplier = 1.0 - (dx / self.boundingRect.width)
        let hMultiplier = 1.0 - (dy / self.boundingRect.height)
        let tr = CGAffineTransform(scaleX: wMultiplier, y: hMultiplier).translatedBy(x: dx * 0.5, y: dy * 0.5)
        return self.applying(tr)
    }
}

struct TestView: View {
    
    let frame = CGRect(origin: .zero, size: CGSize(width: 250, height: 250))
    
    var body: some View {
        
        VStack {
            Path { path in
                path.addRect(frame)
            }
            .insetBy(dx: 20, dy: 20)
            .stroke(lineWidth: 2)
            .foregroundColor(Color.red)
            .background(Color.yellow)
        }
        .frame(width: frame.width, height: frame.height)
        
    }
    
}

然而,我强烈建议***搜索和阅读其他方法。这看起来非常灵活:https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-uibezierpath-and-cgpath-in-swiftui

相关问题