2016-05-14 206 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