使用UIBezierPath類可以創建基于矢量的路徑,這個類在UIKit中。此類是Core Graphics框架關于path的一個封裝。使用此類可以定義簡單的形狀,如橢圓或者矩形,或者有多個直線和曲線段組成的形狀。
UIBezierPath對象是CGPathRef數據類型的封裝。path如果是基于矢量形狀的,都用直線和曲線段去創建。我們使用直線段去創建矩形和多邊形,使用曲線段去創建弧(arc),圓或者其他復雜的曲線形狀。每一段都包括一個或者多個點,繪圖命令定義如何去詮釋這些點。每一個直線段或者曲線段的結束的地方是下一個的開始的地方。每一個連接的直線或者曲線段的集合成為subpath。一個UIBezierPath對象定義一個完整的路徑包括一個或者多個subpaths。
+ (instancetype)bezierPath;//創建一個基本路徑
+ (instancetype)bezierPathWithRect:(CGRect)rect;// 矩形
+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;// 橢圓
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius; // 帶圓角度的矩形
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii;// 帶指定方向圓角度的矩形
+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;// 弧線,
/*
center: 圓弧中心
radius: 圓弧半徑
startAngle: 起點的角度(相對角度坐標系 0)
endAngle: 結束點的角度(相對角度坐標系 0)
clockwise: 是否順時針方向
*/
+ (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath; //通過 CGPath創建
- (void)moveToPoint:(CGPoint)point; // 設置線段的起點
// add*系列--定義一個或多個subpaths
- (void)addLineToPoint:(CGPoint)point;// 添加直線
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise NS_AVAILABLE_IOS(4_0);// 添加弧線
- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;// 添加二次貝塞爾曲線
- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2; // 添加三次貝塞爾曲線
// 繪制
- (void)fill;// 線條區域顏色填充
- (void)stroke;// 線條顏色繪制
- (void)closePath; // 結束一個圖形的subpath,也會連接最后一個點與初始點之間的直線
- (void)removeAllPoints; //移除所有的點,刪除所有的subPath
- (void)appendPath:(UIBezierPath *)bezierPath; // 將bezierPath添加到當前path
創建和使用一個UIBezierPath大概分為四步驟:
(1)創建一個Bezier path對象。
(2)使用方法moveToPoint:去設置初始線段的起點。
(3)添加line或者curve去定義一個或者多個subpaths。
(4)改變UIBezierPath對象跟繪圖相關的屬性。
CAShapeLayer
- 簡單介紹:
CAShapeLayer繼承自CALayer,因此,可使用CALayer的所有屬性。但是,CAShapeLayer需要和貝塞爾曲線配合使用才有意義。
#CAShapeLayer和drawRect的比較
- 1.drawRect:屬于CoreGraphics框架,占用CPU,性能消耗大
- 2.CAShapeLayer:屬于CoreAnimation框架,通過GPU來渲染圖形,節省性能。動畫渲染直接提交給手機GPU,不消耗內存
2156697-2b36247508bef96b.png
CAShapeLayer與UIBezierPath的關系
- 1.CAShapeLayer中shape代表形狀的意思,所以需要形狀才能生效
- 2.貝塞爾曲線可以創建基于矢量的路徑,而UIBezierPath類是對CGPathRef的封裝
- 3.貝塞爾曲線給CAShapeLayer提供路徑,CAShapeLayer在提供的路徑中進行渲染。路徑會閉環,所以繪制出了Shape
- 4.用于CAShapeLayer的貝塞爾曲線作為path,其path是一個首尾相接的閉環的曲線,即使該貝塞爾曲線不是一個閉環的曲線
代碼具體的使用請參考 demo :https://github.com/SummerHH/BezierPath.git
效果圖:
2.gif
參考:
http://www.lxweimin.com/p/b1c38a3a67a9 iOS - 關于貝塞爾曲線與CAShapeLayer的學習
[UIBezierPath類 介紹](http://blog.csdn.net/crayondeng/article/details/11093689)