使用UIBezierPath類能夠建立基於矢量的路徑,這個類在UIKit中。此類是Core Graphics框架關於path的一個封裝。使用此類能夠定義簡單的形狀,如橢圓或者矩形,或者有多個直線和曲線段組成的形狀。
UIBezierPath對象是CGPathRef數據類型的封裝。path若是是基於矢量形狀的,都用直線和曲線段去建立。咱們使用直線段去建立矩形和多邊形,使用曲線段去建立弧(arc),圓或者其餘複雜的曲線形狀。每一段都包括一個或者多個點,繪圖命令定義如何去詮釋這些點。每個直線段或者曲線段的結束的地方是下一個的開始的地方。每個鏈接的直線或者曲線段的集合成爲subpath。一個UIBezierPath對象定義一個完整的路徑包括一個或者多個subpaths。git
+ (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對象跟繪圖相關的屬性。github
CAShapeLayer 介紹app
- 簡單介紹: CAShapeLayer繼承自CALayer,所以,可以使用CALayer的全部屬性。可是,CAShapeLayer須要和貝塞爾曲線配合使用纔有意義。 #CAShapeLayer和drawRect的比較 - 1.drawRect:屬於CoreGraphics框架,佔用CPU,性能消耗大 - 2.CAShapeLayer:屬於CoreAnimation框架,經過GPU來渲染圖形,節省性能。動畫渲染直接提交給手機GPU,不消耗內存
CAShapeLayer與UIBezierPath的關係框架
- 1.CAShapeLayer中shape表明形狀的意思,因此須要形狀才能生效 - 2.貝塞爾曲線能夠建立基於矢量的路徑,而UIBezierPath類是對CGPathRef的封裝 - 3.貝塞爾曲線給CAShapeLayer提供路徑,CAShapeLayer在提供的路徑中進行渲染。路徑會閉環,因此繪製出了Shape - 4.用於CAShapeLayer的貝塞爾曲線做爲path,其path是一個首尾相接的閉環的曲線,即便該貝塞爾曲線不是一個閉環的曲線
代碼具體的使用請參考 demo :https://github.com/SummerHH/BezierPath.git性能
效果圖:學習
參考:動畫
http://www.jianshu.com/p/b1c38a3a67a9 iOS - 關於貝塞爾曲線與CAShapeLayer的學習 [UIBezierPath類 介紹](http://blog.csdn.net/crayondeng/article/details/11093689)