CGContext 'addPath' 到现有绘图

CGContext 'addPath' to the existing drawing

我在自定义 UIView 中绘制了一个 CGPath,如下所示。有一个刷新按钮应该向已绘制的路径添加新行。

 private func refresh() {
    self.setNeedsDisplay()
}

override func draw(_ rect: CGRect){
    guard let context = UIGraphicsGetCurrentContext() else {
        return
    }
    
    context.setLineWidth(1)
    context.addPath(self.newPathPart())
    context.setStrokeColor(UIColor.white.cgColor)
    context.interpolationQuality = .none
    context.setAllowsAntialiasing(false)
    context.setShouldAntialias(false)
    context.strokePath()
   
}

private func newPathPart() -> CGPath {
   let lineWidth: CGFloat = 1
    
    let mPath        = CGMutablePath()
    
    if lastPoint == nil {
        lastPoint = CGPoint(x: self.bounds.midX - lineWidth/2, y: self.bounds.midY - lineWidth/2)
    }
    
    mPath.move(to: lastPoint!)
   
    mPath.addLine(to: CGPoint(x: lastPoint!.x + 15, y: lastPoint!.y + 15))

    lastPoint = CGPoint(x: lastPoint!.x + 15, y: lastPoint!.y + 15)
    mPath.closeSubpath()
   
    return mPath
}

我的印象是 newPartPath() 将附加到绘制的现有路径,但事实似乎并非如此。我希望优化代码,这样我就不会在每次刷新时完全重绘整个路径,而只是添加的路径。如何实现?

您需要随时准备一个 CGMutablePath 或 CGPath 的集合,以便您可以在实际的 CGPath 中不断积累新的路径部分。

调用draw时,有一个rect。您忽略了该参数。不要忽视它。您只需提供 rect 中的绘图部分。因此,检查 rect 并以这样一种方式进行绘制,以补充其中缺少的绘图部分。换句话说,您只绘制与 rect.

相交的路径部分

请注意,如果 是负责知道有新的路径部分等待绘制的人,您可以调用 setNeedsDisplay(in:) rect 的那部分路径,所以这就是 draw.

中要求的 rect