2016-05-14 207 views
1

为了节省任何人在这里使用Google搜索的时间,我错误地认为clearsContextBeforeDrawing也清除添加在drawRect中的任何图层。它不是。要清除绘图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() } 
     } 
    } 
    ... 
    } 

有没有更好的方式来清除“层”在画什么?

回答

3

下面是一个典型方式的drawRect

画不,事实并非如此。这完全是非典型的 - 而且完全错误。

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

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

代码是别的东西完全:你创建了一堆附加层。这正是它的错误所在,以及为什么你会左右事情似乎表现的方式。如果您在drawRect中做了正确的事情,您会发现确实每当它被调用时,视图中的图形都被清除了您的绘图在您的视图中未被清除,因为您有没有绘图在您的视图中。一切都在这些额外的层面。

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

+0

这是一个太开放的问题。我不知道你的总体目标是什么。 – matt

+0

无论如何,我完全明白 - 真棒。当然,我应该吸取当前的情况。然后'clearsContextBeforeDrawing'确实可行 - 好吧!所以我的困惑是,我认为'clearsContextBeforeDrawing'也会“清除图层”,如果你明白我的意思。你已经让我平静了:)尼斯... – Fattie