2010-06-09 117 views
5

我有一個應用程序,我正在做一些自定義繪圖,漸變背景上的一束線,就像這樣(忽略文本,它們只是UILabels) :在iPhone上繪製自定義圖形:CALayer與CGContext

http://prehensile.co.uk/outgoing/Screenshot2010-06-09at12.22.32.png

此刻,這一切都通過啓動一個新的CGContext上,畫的東西把它與CGContextDrawLinearGradient和CGContextStrokePath,最後保存與UIGraphicsGetImageFromCurrentImageContext產生的圖像進行。定位信息是在我繪製這些標籤時計算出來的,因此當包含UIView用drawRect繪製時,它將成爲PITA(並重復工作)來重新計算它,所以我在繪製它之前時間轉換成UIImage。所有的工作都很好,迄今爲止非常好。

但是,我有一個偷偷摸摸的疑問,使用CALayers來做這個繪圖可能更有效率。我對這兩種方法之間差異的理解是CALayer更像是一堆指令來繪製東西,所以在實際繪製在屏幕上之前佔用的內存更少,而提前將所有東西繪製成UIImage意味着無論是否繪製,你都會記得一直在記憶中s s不安的偉大位圖。

這是一個正確的理解?通常認爲什麼是在iPhone上繪製自定義圖像的最佳方式?

回答

1

漂亮的晚的答案,但也許這將是有益的。

CA是比CG更高層的抽象層,所以在CA中做的幾乎所有事情最終都會在CG中實現,但是在渲染時會發生處理併爲您節省內存。

對於您繪製的路徑,您可以使用CAShapeLayer並在佈局時設置路徑和筆觸顏色。每個CAShapeLayer都有它自己的筆畫風格,因此,由於它看起來像是使用了一些白色線條和幾個黑色的厚度,所以每種不同的線條樣式都需要一個單獨的CAShapeLayer。

對於線性漸變,您可以製作1x50的圖像,讓CALayer在渲染時將其拉伸至所需的寬度。將CALayer的內容設置爲CGImageRef,並將其中的內容拉伸到任何模式。對於內存佔用情況,CALayers將是一個明顯的勝利;處理時間永不明顯;預渲染的圖像可能仍然會在那裏獲勝。

0

您可以創建一個圖層來繪製圖像,當圖像發生變化或想要更改當前圖形時,使用[圖層setNeedsDisplay],這將使圖層重繪內容。

通過上述方法

,您可以根據需要重新繪製圖像,不畫連連