清除 drawRect shape-layer 绘图中的绘图

To clear drawing in drawRect shape-layer drawing

为了节省任何人在这里谷歌搜索的时间,我错误地认为 clearsContextBeforeDrawing 也会清除 drawRect 中添加的任何图层。它没有。

当然,正如 Matt 所解释的那样,您当然应该只在 drawRect 中以普通方式绘制,然后 clearsContextBeforeDrawing 才能正常工作。例如,

override func drawRect(rect: CGRect)
    {
    // clearsContextBeforeDrawing works perfectly here as normal
    // don't add any layers in here :)

    let dotPath = UIBezierPath(ovalInRect:rect)
    mainColor.setFill()
    dotPath.fill()
    let ins:CGFloat = ( ringThickness / 2 )
    let circlePath = UIBezierPath(ovalInRect: CGRectInset(rect,ins,ins) )
    circlePath.lineWidth = ringThickness
    ringColor.setStroke()
    circlePath.stroke()
    }

这是一个糟糕的绘制方式drawRect

override func drawRect(rect: CGRect)
    {
    let circlePath = UIBezierPath(ovalInRect:rect)
    let circle = CAShapeLayer()
    circle.path = circlePath.CGPath
    circle.fillColor = someColor.CGColor
    layer.addSublayer(circle)

    ... and a few more layers like ...
    blah.fillColor = someColor.CGColor
    layer.addSublayer(blah)
    }

但是绘制前如何清零呢?

设置clearsContextBeforeDrawing什么都不做。

我唯一能清除的方法是删除所有图层:

override func drawRect(rect: CGRect)
    {
    // first remove all layers...
    if let sublayers = layer.sublayers {
        for layer in sublayers {
            if layer.isKindOfClass(CAShapeLayer) //(essential)
                { layer.removeFromSuperlayer() }
        }
    }
    ...
    }

有没有更好的清除"layer"图的方法?

Here's a typical way to draw in drawRect

不,不是。这完全不典型——而且完全错误。

您在 drawRect 中唯一应该做的就是融入当前环境。例如:

let circlePath = UIBezierPath(ovalInRect:rect)
circlePath.stroke() // draws into the current context

但是 您的 代码完全是另一回事:您正在创建一堆 附加层 。这正是它的问题所在,也是为什么您对事物的行为方式感到困惑的原因。如果您在 drawRect 中做了正确的事情,您会发现确实无论何时调用它,视图 中的绘图都会被 清除。 您视图中的 绘图没有被清除,因为您的视图中没有 绘图。一切都在这些额外的层中。

所以,重新开始。学会正确使用 drawRect。要么直接绘制到当前上下文中,要么将图层管理代码放在其他地方;但不要通过在 drawRect.

中进行图层管理来组合它们