使用CAShapeLayer有以下一些優點
-
渲染快速。
CAShapeLayer使用了硬件加速,繪制同一圖形會比用Core Graphics快很多。 -
高效使用內存。一個
CAShapeLayer不需要像普通CALayer一樣創建一個寄宿圖形,所以無論有多大,都不會占用太多的內存。 -
不會被圖層邊界剪裁掉。一個
CAShapeLayer可以在邊界之外繪制。你的圖層路徑不會像在使用Core Graphics的普通CALayer一樣被剪裁掉。 -
不會出現像素化。當你給
CAShapeLayer做3D變換時,它不像一個有寄宿圖的普通圖層一樣變得像素化。
關於CAShapeLayer和DrawRect的比較
-
CAShapeLayer繼承自CALayer,因此,可使用CALayer的所有屬性。但是,CAShapeLayer需要和貝塞爾曲線配合使用才有意義。 -
-(void)drawRect:(CGRect)rect{}只是一個方法而已,是UIView的方法,重寫此方法可以完成我們的繪制圖形功能。 -
DrawRect:DrawRect屬於CoreGraphic框架,占用CPU,消耗性能大。
-
CAShapeLayer:CAShapeLayer屬於CoreAnimation框架,通過GPU來渲染圖形,節省性能。動畫渲染直接提交給手機GPU,不消耗內。
CAShapeLayer與UIBezierPath的關系
-
CAShapeLayer中shape代表形狀的意思,所以需要形狀才能生效。
-
貝塞爾曲線可以創建基於矢量的路徑,而
UIBezierPath類是對CGPathRef的封裝。 -
貝塞爾曲線給
CAShapeLayer提供路徑,CAShapeLayer在提供的路徑中進行渲染。路徑會閉環,所以繪制出了Shape。 -
用於CAShapeLayer的貝塞爾曲線作為path,其path是一個首尾相連接的閉環曲線,即使該貝塞爾曲線不是一個閉環的曲線。
CAShapeLayer與CALayer
-
普通CALayer在被初始化的時候是需要給一個frame的值的,這個frame值一般都與給定view的bounds值一致,它本身是有形狀的,而且是矩形。
-
CAShapeLayer初始化時也需要指定frame值,但它本身沒有形狀,它的形狀來源於其屬性path。
-
CAShapeLayer有不同於CALayer的屬性,它從CALayer繼承而來的屬性在繪制時是不起作用的。
CAShapeLayer有着幾點很重要
-
CAShapeLayer依附於一個給定的path,必須給與path,而且,即使path不完整也會自動首尾相接。
-
CAShapeLayer屬性:strokeStart以及strokeEnd代表着在這個path中所占用的百分比。
-
CAShapeLayer動畫僅僅限於沿着邊緣的動畫效果,它實現不了填充效果。
CAShapeLayer對象屬性列表
| 屬性名 | 描述 |
|---|---|
| path | CGPathRef 對象,圖形邊線路徑 |
| lineWidth | 邊線的寬度 |
| strokeColor | 邊線的顏色 |
| lineDashPattern | 設置邊線的樣式,默認為實線,該數組為一個NSNumber數組,數組中的數值依次表示虛線中,單個線的長度,和空白的長度, 如:數組@[2,2,3,4] 表示 有長度為2的線,長度為2的空白,長度為3的線,長度為4的空白 不斷循環后組成的虛線。 如圖: |
| lineDashPhase | 邊線樣式的起始位置,即,如果lineDashPattern設置為@[2,2,3,4],lineDashPhase即為第一個長度為2的線的起始位置 |
| lineCap | 線終點的樣式,默認 kCALineCapButt  kCAlineCapRound  kCALineCapSquare  |
| lineJoin | 線拐點處的樣式,默認 kCALineJoinMiter  kCALineJoinRound  kCALineJoinBevel  |
| strokeStart strokeEnd | CGFloat類型,[0,1] 表示畫邊線的起點和終點(即在路徑上的百分比) |
| fillColor | CGColorRef對象,圖形填充色,默認為黑色 |


 kCAlineCapRound
 kCALineCapSquare

 kCALineJoinRound
 kCALineJoinBevel