2016-05-14 23 views
1

ここでグーグルの時間を節約するため、clearsContextBeforeDrawingがdrawRectに追加されたレイヤーもクリアすると誤って考えました。それはしません。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() } 
     } 
    } 
    ... 
    } 

は「層」の描画をクリアするためのより良い方法はありますか?

答えて

3

ここいいえ、それはないのdrawRect

に描画するための典型的な方法です。それはまったく異型であり、全く間違っています。

drawRectで行うべき唯一のことは、現在のコンテキストに描画していることです。たとえば:

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

しかしあなたコードは完全に何か他のものについてです:あなたは追加の層の束を作成しています。そして、それはまさにそれが間違っていること、そして物事が行動するように頭が傷ついている理由です。 drawRectで正しいことをしていた場合は、実際に呼び出されるたびに、ビューの図面はがクリアされていることがわかります。 図面が表示されているため、図面の図面がクリアされていません。すべてがこれらの余分な層にあります。

だから、やり直してください。 drawRectを正しく使用する方法を学んでください。現在のコンテキストに直接描画するか、レイヤー管理コードを別の場所に配置します。 drawRectでレイヤー管理を行い、それらを結合しないでください。

+0

これはあまりにも開いた質問です。あなたの全体的な目標が何であるかという考えはありません。 – matt

+0

とにかく私は完全にそれを得る - 素晴らしい。もちろん、私は現在の状況に取り組んでいたはずです。そして、本当に 'clearsContextBeforeDrawing'はうまくいきます - よろしく!だから私の混乱は、あなたが私が意味するものを見れば、 'clearsContextBeforeDrawing'も"レイヤーをクリア "すると思ったということでした。あなたは私をまっすぐにセットしました:) Nice ... – Fattie

関連する問題