2012-01-25 66 views
3

是否可以動畫製作UIView的CoreGraphics內容?爲UIView的CoreGraphics/drawRect內容製作動畫

說我有一個UIView子類,稱爲MyView實現了drawRect:方法,像這樣:

- (void) drawRect: (CGRect) rect { 
    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetStrokeColorWithColor(c, someColor); 
    CGContextSetLineWidth(c, someWidth); 
    CGContextMoveToPoint(c, leftOfMyUIView, topOfMyUIView); 
    CGContextAddLineToPoint(c, leftOfMyUIView, bottomOfMyUIView); 
    CGContextStrokePath(c); 
} 

換句話說 - 它繪製一條垂直線下來我UIView的子類的左手邊。是否有一種簡單的方法現在爲此UIView設置動畫,以便該線從視圖的左側移動到右側?我希望它從左向右「漂移」。

要清楚 - 我不會去的原因我不能移動/動畫MyView的實例。我能想到的最佳解決方案是添加一個新的UIView子類。像LineView extends UIView之類的東西,然後使LineView看到我要繪製的線條的確切尺寸,用它自己的drawRect方法填充它,然後將LineView的實例添加到MyView作爲子視圖。這將允許我使用動畫塊對LineView對象的位置進行動畫處理,但是看起來過於複雜以至於無法實現如此簡單的操作。

+0

您的更新幾乎是我第一次看到這個問題時要提出的答案... drawRect不是用於動畫,而是繪製在單個時間點上。您可以爲視圖的屬性(在本例中爲「中心」)設置動畫。使你的線條成爲子視圖或子層(CAShapeLayer爲了簡單起見,只是想到了這一點),並且這是實現它的唯一方法。 – jrturton

+0

我正在處理的問題將意味着我需要創建這些'LineView'實例的許多(搜索)。我不會做任何比動畫每一行的位置更復雜的事情。鑑於此背景,您的兩個建議中的哪一個('UIView'或'CALayer')最適合?他們之間有很多表現明智的? – Barjavel

+0

CAShapeLayer會是最好的 - 那麼你並沒有創建一個全新的視圖,它只是你視圖的一個屬性。 – jrturton

回答

0

根據您的評論,將有數百個LineView實例,最好使用CALayer子類而不是UIView子類。 UIView對象爲您提供事件處理,在iOS上,每個UIView擁有一個CALayer來處理其渲染。如果你不想/需要個別行的事件跟蹤,那麼所有這些UIView實例可能都是無用的開銷。您可以訪問父級UIView的圖層,並根據需要添加行子圖層。

如果我正確理解你的問題,應該不需要CoreGraphics。您可以設置線條圖層的backgroundColor來處理填充。或者如果線條不是直的,可以使用CAShapeLayer來渲染線條的路徑。