2010-12-21 103 views
0

我正在嘗試使用Quartz 2d繪製一條動畫生長線,逐漸向一條現有線添加點。我開始繪製一條新線,在UIView的drawRect方法中,通過獲取CGContextRef,設置其繪製屬性以及將第一個點移動到(0,0)。在IOS上使用Quartz 2d編程動畫繪製一條線

CGContextRef context= UIGraphicsGetCurrentContext(); 
CGContextSetStrokeColorWithColor(context,[UIColor blueColor].CGColor); 
CGContextSetLineWidth(context, 2); 
CGContextMoveToPoint(context,0,0); 

後來,在我的下的drawRect電話,我想再次延伸的線,在獲得CGContextRef,並增加了新的指向它。

GContextRef context= UIGraphicsGetCurrentContext(); 
CGContextAddLineToPoint(context,x,y); 

但似乎目前CGContextRef沒有從上次的drawRect呼叫我以前CGContextMoveToPoint命令的任何記錄,因此沒有,我已經開始畫線的任何引用。

我在這裏做錯了什麼?有沒有辦法引用已經繪製的線?

+0

謝謝,我很驚訝蘋果的文檔不包括任何參考,具體行爲,就像它很明顯... – 2010-12-26 11:27:06

回答

1

你基本上需要把每個呼叫看作drawRect,好像它從頭開始一樣。即使您只被要求更新視圖的子部分,也應該假定與圖形上下文相關的任何狀態(例如繪製位置和顏色)都將被重置。所以在你的情況下,你需要跟蹤起始位置並且每次重畫整行。

+0

它不是非常優化的方法,因爲我認爲這種方法不應該被用作「繪製循環」 。 – DanSkeel 2012-05-15 15:28:21

0

我認爲更好的方法是動畫一些薄UIView。看我的回答here
如果您需要的不僅僅是水平線,請旋轉該視圖。我認爲這對性能更好。

+0

你不僅錯在最好的策略 - 濫用視圖層次結構很少是正確的方式來畫東西 - 你似乎也錯過了這個問題的重點... – walkytalky 2012-05-16 10:22:08

+0

是的,你是對的,我錯過了這個觀點(。你認爲你的答案對解決這個問題也是有益的(http://stackoverflow.com/questions/10603391/ios-animating-the-drawing-of-a-line/10603854# 10603854)?我認爲我不應該過於頻繁地重畫嗎?我會刪除這個答案。 – DanSkeel 2012-05-16 12:15:49

+0

你不應該頻繁地重畫,但是你也不可能不必頻繁地重繪,因爲你可能會得到別的東西來做。爲你繪製 - 就像一個視圖 - 但繪圖仍然需要進行,視圖代碼可能會或可能不會比你自己寫的更好地優化,但這取決於它的設計與做什麼和你想做什麼(繼續...) – walkytalky 2012-05-17 10:08:22