在drawRect形状图层绘图中清除绘图

时间:2016-05-14 21:02:37

标签: ios swift calayer drawrect

为了节省在Google上搜索的人的时间,我错误地认为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() }
        }
    }
    ...
    }

有没有更好的方法来清除“图层”图纸?

1 个答案:

答案 0 :(得分:4)

  

这是在drawRect中绘制的典型方法

不,不是。这完全是非典型的 - 完全错误。

你应该在drawRect中做的唯一事情是进入当前的背景。例如:

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

你的代码完全与其他东西有关:你正在创建一堆附加图层。而这正是它的错误,以及为什么你会对事物的行为方式感到头疼。如果你在drawRect中做了正确的事情,你会发现无论何时调用它,视图中的绘图都被清除。由于您的视图中没有绘图,因此未在视图中清除您的绘图。一切都在这些额外的层次中。

所以,重新开始。学习正确使用drawRect。直接绘制到当前上下文中,或将您的图层管理代码放在其他位置;但不要通过在drawRect中进行图层管理来组合它们。