【问题标题】:Changing colour of path drawn in UIView draw(_rect)更改 UIView draw(_rect) 中绘制的路径颜色
【发布时间】:2019-09-30 19:42:12
【问题描述】:

我在我的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),但我特别想更好地理解核心图形,我想了解为什么这不起作用。

【问题讨论】:

  • 在我看来这不可能发生。也许你在你的观点之上有另一个观点?你确定这两种颜色真的不一样?在我看来,错误将在其他地方。
  • 颜色肯定是不同的,但我做了一个快速检查,实际上我在我的超级视图中看到的观看次数比我预期的要多……调查一下,大概就是这个问题,先发制人的谢谢以防万一。
  • 啊,我在layoutSubviews 中调用了视图设置代码,并且被调用了两次。非常基本的错误。

标签: ios uiview core-graphics


【解决方案1】:

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

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

谢谢苏丹。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多