CAShaperLayer&UIBezierPath簡介
使用 UIbezierPath 和 CAShapeLayer 可以畫出你想要的任何形狀,沒有它做不到,只有你想不到,搞定了它們你就可以輕鬆定製你想要的任何控制元件了。
CAShaperLayer
蘋果官方的定義:A layer that draws a cubic Bezier spline in its coordinate space.
繼承於CALayer。 每個CAShapeLayer物件都代表著將要被渲染到螢幕上的一個任意的形狀(shape)。
同時CAShaperLayer具有以下特點:
- CAShapeLayer可以被觸碰和填充,並且CAShapeLayer可以通過Path屬性進行形狀的調節
- CAshapeLayer具有許多動畫特性,與UIBezierPath結合,可以輕鬆定製你想要的圖形
- CAshapeLayer能在GPU上渲染,提升效率,減少CPU的負擔
Note:
Shape rasterization may favor speed over accuracy. For example, pixels with multiple intersecting path segments may not give exact results.
由於CAShapeLayer更喜歡速度超過準確性,所以用CAShapeLayer繪製的圖形會出現鋸齒。(如果不用放大鏡的話,應該很難看出區別)
常用屬性的介紹
1.CGPathRef path
/* The path defining the shape to be rendered. If the path extends
* outside the layer bounds it will not automatically be clipped to the
* layer, only if the normal layer masking rules cause that. Upon
* assignment the path is copied. Defaults to null. Animatable.
* (Note that although the path property is animatable, no implicit
* animation will be created when the property is changed.) */
複製程式碼
path定義了形狀的渲染,如果路徑超過layer的bounds,那麼那部分的path將不會在layer上顯示。同時path在賦值的時候將會進行深拷貝。預設值為空。請注意,儘管path屬性是可動畫的,但在更改屬性時不會建立隱式動畫。
隱式動畫
當對非Root Layer的部分屬性進行修改時,預設會自動產生一些動畫效果,而這些屬性稱為Animatable Properties(可動畫屬性)
bounds
:用於設定CALayer的寬度和高度。修改這個屬性會產生縮放動畫backgroundColor
:用於設定CALayer的背景色。修改這個屬性會產生背景色的漸變動畫position
:用於設定CALayer的位置。修改這個屬性會產生平移動畫
可以通過動畫事務CATransaction
關閉預設的隱式動畫效果
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];
複製程式碼
2.CGFloat strokeStart && CGFloat strokeEnd
/* These values define the subregion of the path used to draw the
* stroked outline. The values must be in the range [0,1] with zero
* representing the start of the path and one the end. Values in
* between zero and one are interpolated linearly along the path
* length. strokeStart defaults to zero and strokeEnd to one. Both are
* animatable. */
- strokeStart它表示描線開始的地方佔總路徑的百分比
- 對比strokeStart stokeEnd代表了繪製結束的地方站總路徑的百分比
UIBezierPath
A path that consists of straight and curved line segments that you can render in your custom views.
UIBezierPath
物件是CGPathRef資料型別的封裝。有兩種使用方式:
1.重寫view的drawRect方法
- (void)drawRect:(CGRect)rect {
UIColor *color = [UIColor redColor];
[color set]; //設定線條顏色
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(10, 10)];
[path addLineToPoint:CGPointMake(200, 80)];
path.lineWidth = 5.0;
path.lineCapStyle = kCGLineCapRound; //線條拐角
path.lineJoinStyle = kCGLineJoinRound; //終點處理
[path stroke];
}
複製程式碼
path.lineWidth = 5.0
設定劃線的寬度path.lineCapStyle
終點的樣式kCGLineCapButt
該屬性值指定不繪製端點, 線條結尾處直接結束。這是預設值kCGLineCapRound
該屬性值指定繪製圓形端點, 線條結尾處繪製一個直徑為線條寬度的半圓。kCGLineCapSquare
該屬性值指定繪製方形端點。 線條結尾處繪製半個邊長為線條寬度的正方形。需要說明的是,這種形狀的端點與“butt”形狀的端點十分相似,只是採用這種形式的端點的線條略長一點而已
path.lineJoinStyle
設定兩條線連結點的樣式kCGLineJoinMiter
斜接kCGLineJoinRound
圓滑銜接kCGLineJoinBevel
斜角連線
[path stroke]
描邊[path fill]
填充邊框內部
2.結合CAShaperLayer進行使用
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(110, 100, 150, 100)];
CAShapeLayer *layer = [CAShapeLayer layer];
layer.path = path.CGPath;
layer.strokeColor = [UIColor blackColor].CGColor;
layer.fillColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:layer];
複製程式碼
stokeColor
設定圖形邊框的顏色fillColor
設定圖形填充的顏色,如果不設定,預設為stokeColor