2011-09-20 62 views
1

所以,我知道我的問題的標題可能不是最描述,所以我會通過它跑這裏來了:CAShapeLayer路徑變爲彩色

基本上我有什麼是觀點與圖像(使用層的內容屬性),在這一層下,我有一個繪圖層,它是一個CAShapeLayer。在我看來兩個圖層都有生命的情況下,我還有一個CALayerDelegate,現在只需使用具有給定顏色的CGPaths繪製一個點,以響應點擊手勢(點擊手勢選擇器調用CAShapeLayer上的setNeedsDisplay)。我遇到的問題是,如果我改變顏色,然後點擊視圖所有以前的點自動成爲新選擇的顏色...不好...我需要每個子路徑(即點),以保持其原來的顏色...也許一些代碼將闡明的話題多一點光:

委託(注:drawingView.drawingPath重複使用):

- (void)drawLayer:(CAShapeLayer *)theLayer 
    inContext:(CGContextRef)theContext { 


if (CGPointEqualToPoint(drawingView.startPoint, drawingView.endPoint)) { 


    CGPathMoveToPoint(drawingView.drawingPath, NULL, drawingView.startPoint.x, drawingView.startPoint.y); 
    CGPathAddEllipseInRect(drawingView.drawingPath, NULL, CGRectMake(drawingView.startPoint.x, drawingView.startPoint.y, drawingView.drawRadius, drawingView.drawRadius)); 

    CGContextSetFillColorWithColor(theContext, drawingView.currentColor.CGColor); 
    CGContextBeginPath(theContext); 
    CGContextAddPath(theContext, drawingView.drawingPath); 
    CGContextFillPath(theContext); 

} 

}

而且我雙擊手勢識別:

- (void)viewTapped:(UITapGestureRecognizer *)recognizer { 

CGPoint touchPoint = [recognizer locationInView:recognizer.view]; 
startPoint = endPoint = touchPoint; 
[drawingLayer setNeedsDisplay]; 

}

如果有人能告訴我我在做什麼錯在這裏,我會欣喜若狂! :(

回答

1

每次重繪圖層時,它都會使用先前保存的信息(在本例中是在繪圖視圖中)來繪製所有內容,只能使用這些信息來表示屏幕上的所有內容。在這種情況下,你遇到了麻煩,因爲你沒有保存足夠的信息,你想要的不僅僅是一個繪圖路徑和一個顏色,而是一系列繪圖路徑和顏色,你需要保存一個包含兩個對象的列表在你的drawingView中繪製這些東西,並遍歷它們,繪製每一個,每次你改變當前的顏色,你需要跟蹤已經繪製的東西並將它與舊顏色一起保存,這樣你就不會失去跟蹤哪一種顏色屬於路徑的哪一部分。

+0

感謝您的輸入!So ess你所說的內容是我必須「保存」每個子路徑及其對應的顏色,以便繪製每個水龍頭(以及後面的線)?我懷疑它會降低到這一點,但我會想象,如果我有例如數百個子路徑(例如在數組中),它可能變得非常低效。嗯...也許我可以使用一個空的圖像,並繪製到它而不是shapelayer?我想這可能會更有效率.... – johnnyd

+0

繪製成圖像是一種替代方案,銘記它不可逆。作爲一個通用的解決方案,我建議保存這些組件,但是如果一張圖像能夠爲您更好地工作,無論如何。 :) –