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

Posted

技术标签:

【中文标题】清除drawRect形状层绘图中的绘图【英文标题】:To clear drawing in drawRect shape-layer drawing 【发布时间】:2016-05-14 21:02:37 【问题描述】:

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

当然,正如马特所解释的,你当然应该只在 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】:

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

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

您在drawRect 中唯一应该做的就是绘制到当前上下文中。例如:

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

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

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

【讨论】:

这是一个太开放的问题。我不知道你的总体目标是什么。 无论如何我完全明白 - 太棒了。当然,我应该一直在吸引当前的上下文。然后确实clearsContextBeforeDrawing 确实有效 - 耶!所以我的困惑是,如果你明白我的意思,我认为clearsContextBeforeDrawing 也会“清除层”。你让我直截了当:) 很好......

以上是关于清除drawRect形状层绘图中的绘图的主要内容,如果未能解决你的问题,请参考以下文章

手动调用 Drawrect

iOS 绘图-UIBezierPath

从 UIImage 清除 UIView 绘图

用 Drawrect 绘图

Swift drawRect 函数不会更新绘图

使用drawRect延迟加载UIView:绘图