UIBezierPath文檔

文檔內容大致分為:

  1. 創(chuàng)建path
  2. 構造路徑
  3. 路徑屬性
  4. 虛線

概述

UIBezierPath 類允許你在自定義的 View 中繪制和渲染由直線和曲線組成的路徑. 你可以在初始化的時候, 直接為你的 UIBezierPath 指定一個幾何圖形. 路徑可以是簡單的幾何圖形例如: 矩形灶平、橢圓记劈、弧線之類的, 也可以是相對比較復雜的由直線和曲線組成的多邊形. 當你定義完圖形以后, 你可以使用額外的方法將你的路徑直接繪制在當前的繪圖上下文中.
UIBezierPath 是由幾何路徑和屬性組成的, 屬性是用來在渲染階段描繪幾何路徑的, 比如線寬之類的東西. 路徑和屬性是完全獨立的, 他們并不互相依賴, 你可以分開分開去設置他們. 一旦你以自己喜歡的方式配置了 UIBezierPath 對象, 你就可以調用方法通知UIBezierPath 在當前的繪圖上下文中繪制圖形了. 因為創(chuàng)建掀泳、 配置宿崭、 渲染路徑等操作, 都是完全不同的步驟, 所以你可以在你的代碼中非常容易的對 UIBezierPath 對象進行復用. 你甚至可以使用同一個 UIBezierPath 對象去渲染同一個圖形很多次, 你也可以再多次渲染的間隔中, 修改屬性來渲染出不同樣式的路徑.
當你創(chuàng)建了一個空的UIBezierPath 對象時, currentPoint 這個屬性是未定義的, 你需要手動的去設置. currentPoint. 如果你希望在不繪制任何線條的情況下移動currentPoint, 你可以使用 moveToPoint:方法. 其他的方法都會導致在你的路徑中添加額外的直線或曲線. 所有構造路徑相關的方法, 都會以當前路徑的currentPoint 為起點, 以你指定的endPoint為終點進行繪制. 當完成繪制之后, 會自動將新增的這條線的終點設置為UIBezierPath 對象的currentPoint.
一個簡單的UIBezierPath 可以包含許多的開放子路徑和封閉子路徑. 調用closePath方法將會閉合路徑, 它將會從currentPoint 到 子路經的 firstPoint繪制一條直線. 調用moveToPoint:方法將會結束當前的子路徑, 但是并不會自動閉合當前的自路徑, 并且會將currentPoint 移動到指定的點, 也就是下一條繪制路徑的起始點. UIBezierPath 中所有的自路徑都會共享同樣的繪圖屬性. 如果你希望繪制一些子路徑, 但是不適用相同的繪圖屬性, 那么你就只能創(chuàng)建很多的UIBezierPath 對象來承載每一條路徑.
當你為UIBezierPath 對象配置完幾何路徑和繪圖屬性之后, 你就可以使用strokefill 方法在當前的繪圖上下文中進行繪制了. stroke 方法將會使用當前的 strokeColor 和 繪圖屬性來描繪曲線的輪廓. 同樣的, fill 方法將會使用 fillColor 來填充路徑所圍成的圖形(使用 UIColor 類方法來設置 strokeColorfillColor ).

API內容

typedef NS_OPTIONS(NSUInteger, UIRectCorner) {
    UIRectCornerTopLeft     = 1 << 0,
    UIRectCornerTopRight    = 1 << 1,
    UIRectCornerBottomLeft  = 1 << 2,
    UIRectCornerBottomRight = 1 << 3,
    UIRectCornerAllCorners  = ~0UL
};


#pragma mark --
///----------------
/// 創(chuàng)建 UIBezierPath
///----------------

+ (instancetype)bezierPath;

// 矩形
+ (instancetype)bezierPathWithRect:(CGRect)rect;

// 橢圓
+ (instancetype)bezierPathWithOvalInRect:(CGRect)rect;

// 圓角矩形
+ (instancetype)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius;

// 自定義圓角矩形(UIRectCorner:指定哪個角變?yōu)閳A角;cornerRadii:圓角半徑)
+ (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;

// 從CGPath得到一個path(起到連接CGPathRef和UIBezierPath)
+ (instancetype)bezierPathWithCGPath:(CGPathRef)CGPath;



///----------------
/// 構造路徑、操作路徑
///----------------

// 將 UIBezierPath 對象的 currentPoint 移動到指定的點

- (void)moveToPoint:(CGPoint)point;

// 追加一條直線

- (void)addLineToPoint:(CGPoint)point;

// 在當前子路經中追加一條 三次貝塞爾曲線
- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2;

// 追加一條 二次貝塞爾曲線
- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint;

// 追加一條圓弧
- (void)addArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise NS_AVAILABLE_IOS(4_0);

// 關閉當前子路經,從 currentPoint 到子路經的起點 繪制一條直線绎速,緊接著該方法將會更新 currentPoint
- (void)closePath;

// 刪除所有點,即刪除所有路徑
- (void)removeAllPoints;

// Appending paths
// 追加指定UIBezierPath
- (void)appendPath:(UIBezierPath *)bezierPath;

// Modified paths
// 不會修改該路徑的樣子. 它僅僅是修改了繪制的方向
- (UIBezierPath *)bezierPathByReversingPath NS_AVAILABLE_IOS(6_0);

// Transforming paths
// 對路徑放射變換操作
- (void)applyTransform:(CGAffineTransform)transform;





// Path info

// 記住, 就算你僅僅調用了 moveToPoint 方法,那么當前路徑也被看做不為空.
@property(readonly,getter=isEmpty) BOOL empty;

// 該屬性描述的是一個能夠完全包含路徑中所有點的一個最小的矩形區(qū)域. 該區(qū)域包含二次貝塞爾曲線和三次貝塞爾曲線的控制點.
@property(nonatomic,readonly) CGRect bounds;

// 該屬性的值, 將會是下一條繪制的直線或曲線的起始點.如果當前路徑為空, 那么該屬性的值將會是 CGPointZero
@property(nonatomic,readonly) CGPoint currentPoint;

// 當曲線的覆蓋區(qū)域包含指定的點(內部點)焙蚓;
// 注意:如果是開放路徑纹冤,該方法會返回NO,此時要先copy一份路徑购公,并調用 -(void)closePath; 將路徑封閉, 然后再調用此方法來判斷指定點是否是內部點.
- (BOOL)containsPoint:(CGPoint)point;




// Drawing properties

// 線寬
@property(nonatomic) CGFloat lineWidth;

// 兩端的樣式
@property(nonatomic) CGLineCap lineCapStyle;

// 連接處的樣式
@property(nonatomic) CGLineJoin lineJoinStyle;

// 內角和外角距離最大的距離
@property(nonatomic) CGFloat miterLimit; // Used when lineJoinStyle is kCGLineJoinMiter

// 渲染精度(該屬性的值用來測量真實曲線的點和渲染曲線的點的最大允許距離.)
// 值越小, 渲染精度越高, 會產生相對更平滑的曲線, 但是需要花費更多的計算時間.
// 默認0.6
@property(nonatomic) CGFloat flatness;

// 是否使用基偶填充規(guī)則
/**
 * 設置為 YES, 則路徑將會使用 基偶規(guī)則 (even-odd) 進行填充.
 * 設置為 NO,  則路徑將會使用 非零規(guī)則 (non-zero) 規(guī)則進行填充.
 */
@property(nonatomic) BOOL usesEvenOddFillRule; // Default is NO. When YES, the even-odd fill rule is used for drawing, clipping, and hit testing.

// 虛線
- (void)setLineDash:(nullable const CGFloat *)pattern count:(NSInteger)count phase:(CGFloat)phase;

// 重新獲取虛線的模式
- (void)getLineDash:(nullable CGFloat *)pattern count:(nullable NSInteger *)count phase:(nullable CGFloat *)phase;


// Path operations on the current graphics context

- (void)fill;
- (void)stroke;

// These methods do not affect the blend mode or alpha of the current graphics context
- (void)fillWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;
- (void)strokeWithBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;

// 刪除剪切區(qū)域,那么你必須在調用該方法前, 先使用 CGContextSaveGState 方法保存當前的繪圖狀態(tài), 當你不再需要這個剪切區(qū)域的時候, 你只需要使用 CGContextRestoreGState 方法
- (void)addClip;

詳細參考:http://www.reibang.com/p/6130b51a0b71

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末赵哲,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子君丁,更是在濱河造成了極大的恐慌,老刑警劉巖将宪,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绘闷,死亡現場離奇詭異橡庞,居然都是意外死亡,警方通過查閱死者的電腦和手機印蔗,發(fā)現死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進店門扒最,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人华嘹,你說我怎么就攤上這事吧趣。” “怎么了耙厚?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵强挫,是天一觀的道長。 經常有香客問我薛躬,道長俯渤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任型宝,我火速辦了婚禮八匠,結果婚禮上,老公的妹妹穿的比我還像新娘趴酣。我一直安慰自己梨树,他們只是感情好,可當我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布岖寞。 她就那樣靜靜地躺著抡四,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慎璧。 梳的紋絲不亂的頭發(fā)上床嫌,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天,我揣著相機與錄音胸私,去河邊找鬼厌处。 笑死,一個胖子當著我的面吹牛岁疼,可吹牛的內容都是我干的阔涉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼捷绒,長吁一口氣:“原來是場噩夢啊……” “哼瑰排!你這毒婦竟也來了?” 一聲冷哼從身側響起暖侨,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤椭住,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后字逗,有當地人在樹林里發(fā)現了一具尸體京郑,經...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宅广,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了些举。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跟狱。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖户魏,靈堂內的尸體忽然破棺而出驶臊,到底是詐尸還是另有隱情,我是刑警寧澤叼丑,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布关翎,位于F島的核電站,受9級特大地震影響幢码,放射性物質發(fā)生泄漏笤休。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一症副、第九天 我趴在偏房一處隱蔽的房頂上張望店雅。 院中可真熱鬧,春花似錦贞铣、人聲如沸闹啦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窍奋。三九已至,卻和暖如春酱畅,著一層夾襖步出監(jiān)牢的瞬間琳袄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工纺酸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窖逗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓餐蔬,卻偏偏與公主長得像碎紊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子樊诺,可洞房花燭夜當晚...
    茶點故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內容