2016-05-14 14 views
1

Um Zeit für jeden zu googeln hier zu sparen, dachte ich falsch, dass clearsContextBeforeDrawing würde auch löschen alle Schichten in DrawRect hinzugefügt. Es tut nicht.Um Zeichnung in drawRect shape-layer Zeichnung zu löschen

Natürlich, wie Matt erklärt hat, sollten Sie sicherlich nur den gewöhnlichen Weg in drawRect zeichnen, und dann funktioniert clearsContextBeforeDrawing korrekt. Beispiel

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() 
    } 

Hier ist ein schlechter Weg in 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) 
    } 

zu ziehen Aber wie vor dem Zeichnen löschen?

Einstellung clearsContextBeforeDrawing tut nichts.

Der einzige Weg, ich löschen kann, ist durch alle Schichten zu entfernen:

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() } 
     } 
    } 
    ... 
    } 

Gibt es einen besseren Weg, um die „Schicht“ löschen zeichnen?

Antwort

3

Hier ist eine typische Art und Weise in drawRect

Nein zu ziehen, ist es nicht. Es ist total untypisch - und total falsch.

Das einzige, was Sie in drawRect tun sollten, ist das Zeichnen in den aktuellen Kontext. Zum Beispiel:

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

Aber Ihre Code ist etwas ganz anderes: Sie sind ein Haufen zusätzliche Schichten zu schaffen. Und das ist genau das, was falsch daran ist, und warum Sie sich den Kopf darüber verrenken, wie sich die Dinge zu verhalten scheinen. Wenn Sie die richtige Sache in drawRect tun, würden Sie tatsächlich finden, wenn es aufgerufen wird, wird die Zeichnung in der Ansicht gelöscht. Ihre Zeichnung in Ihrer Ansicht wird nicht gelöscht, weil Sie keine Zeichnung in Ihrer Ansicht haben. Alles ist in diesen zusätzlichen Schichten.

Also, neu beginnen. Lernen Sie, drawRect korrekt zu verwenden. Zeichnen Sie entweder direkt in den aktuellen Kontext, oder legen Sie den Layerverwaltungscode an anderer Stelle ab. aber kombinieren Sie sie nicht, indem Sie Ihre Layer-Verwaltung in drawRect.

+0

Das ist eine viel zu offene Frage. Ich habe keine Ahnung, was Ihr Gesamtziel ist. – matt

+0

Egal, ich verstehe es total - super. Natürlich hätte ich mich dem aktuellen Kontext anschließen müssen. Und dann funktioniert 'clearsContextBeforeDrawing' tatsächlich - yay! So war meine Verwirrung, dass ich dachte, dass "clearContextBeforeDrawing" auch "Ebenen löschen" würde, wenn Sie sehen, was ich meine. Du hast mich richtig gestellt :) Schön ... – Fattie