更改在 UIView draw(_rect) 中绘制的路径的颜色

Changing colour of path drawn in UIView draw(_rect)

我在 UIView 子类的 draw(_ rect: CGrect) 函数中使用 addArc 画了一个圆。它最初绘制得很好,但是当某些 UI 触发器发生时,我想通过更改 isFilledIn 属性 的值来更改圆的填充颜色。

但是,isFilledIn 属性修改后,我的圈子并没有改变。 isFilledIn 属性 和 draw 方法都按预期被调用,但圆圈的外观没有改变。好像画完圆圈,样子就卡住了。

var isFilledIn = false {
    didSet {
        setNeedsDisplay()
    }
}

override func draw(_ rect: CGRect) {
    if let context = UIGraphicsGetCurrentContext() {            
        context.setLineWidth(outlineWidth)
        myOutlineColor.setStroke()

        if isFilledIn {
            myFilledColor.setFill()
        } else {
            myEmptyColor.setFill()
        }

        let center = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
        let radius = (frame.size.width - 10) / 2

        context.addArc(center: center, radius: radius, startAngle: 0.0, endAngle: .pi * 2.0, clockwise: true)

        context.drawPath(using: .fillStroke)
    }
}

我尝试添加 context.clear(rect) 但没有效果。我还考虑过将 CGPath 保存到 属性 并尝试修改它而不是调用 setNeedsDisplay 但我不确定如果我只有一个,如何应用填充颜色更改CGPath.

我意识到还有其他可能更容易/更有效的方法来创建圆圈(例如 UIBezierPath,或带有圆角半径的 UIView),但我特别想了解 Core图形更好,我想了解为什么这不起作用。

layoutSubviews 中调用我的视图设置代码,忘记了该方法可能会被调用多次(确实如此)。因此,正如 Sulthan 在上面的评论中指出的那样,我确实有重叠的观点。在我试图重画的圆圈之上有第二个圆圈。

layoutSubviews 中添加一个 if 语句以防止它多次设置圆圈为我修复了它。

谢谢苏丹。