iOS UIBezierPath基本使用

概述

UIBezierPath用于定義一個由直線/曲線組合而成的路徑, 并且可以在自定義視圖中渲染該路徑. 在使用的過程中, 我們只需要先指定好路徑的結構, 比如一條直線越驻、一條貝塞爾曲線汁政、一個矩形、一個橢圓缀旁、一個圓弧等, 然后使用系統(tǒng)為我們提供的方法將構建好的路徑渲染出來即可记劈。UIBezierPath位于UIKit庫中, 是針對Core Graphics庫中的CGPathRef的封裝

1.基本畫線

// 創(chuàng)建path

UIBezierPath *path = [UIBezierPath bezierPath];

// 添加路徑1條點(100,100)到點(200,100)的線段]到path

[path moveToPoint:CGPointMake(100 , 100)];

[path addLineToPoint:CGPointMake(200, 100)];

// 將path繪制出來

[path stroke];

2.矩形

UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(100, 10, 100, 100)];//矩形

path.lineWidth = 5;//邊框?qū)挾?/p>

path.lineCapStyle = kCGLineCapRound;//線條拐角樣式

path.lineJoinStyle = kCGLineCapRound;//終點拐角樣式

[[UIColor redColor] set];//設置填充顏色

[[UIColor orangeColor] setStroke];//邊框線條色

[path closePath];//關閉路徑

[path stroke];//渲染 繪制

[path fill];//填充顏色 不會遮擋邊框色

3.圓

UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(100, 10, 100, 100)];//圓

//UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(100, 10, 100, 50)];//橢圓

path.lineWidth = 5;//邊框?qū)挾?/p>

[[UIColor redColor] set];//設置填充顏色

[[UIColor orangeColor] setStroke];//邊框線條色

[path closePath];//關閉路徑

[path stroke];//渲染 繪制

[path fill];//填充顏色 不會遮擋邊框色

4.圓弧

#define DEGREES_TO_RADIANS(degrees) ((degrees)*M_PI)/180

UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.frame.size.width/2, self.frame.size.height/2) radius:50 startAngle:0 endAngle:DEGREES_TO_RADIANS(120) clockwise:YES];//clockwise YES順時針 NO逆時針

path.lineWidth = 2;

path.lineCapStyle = kCGLineCapRound;

path.lineJoinStyle = kCGLineCapRound;

[[UIColor redColor] setFill];

[path stroke];

5.貝塞爾曲線

// 第一種

UIBezierPath *path = [UIBezierPath bezierPath];

path.lineWidth = 2;

path.lineCapStyle = kCGLineCapRound;

path.lineJoinStyle = kCGLineCapRound;

[path moveToPoint:CGPointMake(100, 100)];

[path addQuadCurveToPoint:CGPointMake(250, 100) controlPoint:CGPointMake(150, 10)];

[[UIColor redColor] setStroke];

[path stroke];

//第二種

UIBezierPath *path = [UIBezierPath bezierPath];

path.lineWidth = 2;

path.lineCapStyle = kCGLineCapRound;

path.lineJoinStyle = kCGLineCapRound;

[path moveToPoint:CGPointMake(100, 100)];

[path addCurveToPoint:CGPointMake(250, 100) controlPoint1:CGPointMake(150, 0) controlPoint2:CGPointMake(180, 120)];

[[UIColor redColor] setStroke];

[path stroke];

實例:

UIBezierPath *path = [UIBezierPath bezierPath];

CGSize size = self.bounds.size;

CGFloat margin = 10;

CGFloat radius = rintf(MIN(size.height - margin, size.width - margin)/4);

CGFloat xOffset, yOffset;

CGFloat offset = rintf((size.height - size.width) / 2);

if (offset > 0) {

xOffset = (CGFloat)rintf(margin/2);

yOffset = offset;

}else{

xOffset = -offset;

yOffset = rintf(margin/2);

}

[[UIColor redColor] setFill];

[path addArcWithCenter:CGPointMake(radius * 2 + xOffset, radius + yOffset)

radius:radius

startAngle:(CGFloat)-M_PI

endAngle:0

clockwise:YES];

[path addArcWithCenter:CGPointMake(radius * 3 + xOffset, radius * 2 + yOffset)

radius:radius

startAngle:(CGFloat)-M_PI_2

endAngle:(CGFloat)M_PI_2

clockwise:YES];

[path addArcWithCenter:CGPointMake(radius * 2 + xOffset, radius * 3 + yOffset)

radius:radius

startAngle:0

endAngle:(CGFloat)M_PI

clockwise:YES];

[path addArcWithCenter:CGPointMake(radius + xOffset, radius * 2 + yOffset)

radius:radius

startAngle:(CGFloat)M_PI_2

endAngle:(CGFloat)-M_PI_2

clockwise:YES];

[path closePath];

[path fill];

6.CAShapeLayer與UIBezierPath

CGPoint point1 = CGPointMake(50, 10);

CGPoint point2 = CGPointMake(200, 10);

CGPoint point3 = CGPointMake(200, 40);

CGPoint point4 = CGPointMake(230, 40);

CGPoint point5 = CGPointMake(200, 60);

CGPoint point6 = CGPointMake(200, 150);

CGPoint point7 = CGPointMake(50, 150);

UIBezierPath *path = [UIBezierPath bezierPath];

[path moveToPoint:point1];

[path addLineToPoint:point2];

[path addLineToPoint:point3];

[path addLineToPoint:point4];

[path addLineToPoint:point5];

[path addLineToPoint:point6];

[path addLineToPoint:point7];

[path closePath];

CAShapeLayer *shapelayer = [CAShapeLayer layer];

shapelayer.path = path.CGPath;

shapelayer.fillColor = [[UIColor orangeColor] CGColor];

[self.layer addSublayer:shapelayer];

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市并巍,隨后出現(xiàn)的幾起案子目木,更是在濱河造成了極大的恐慌,老刑警劉巖懊渡,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刽射,死亡現(xiàn)場離奇詭異军拟,居然都是意外死亡,警方通過查閱死者的電腦和手機誓禁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門懈息,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人摹恰,你說我怎么就攤上這事辫继。” “怎么了俗慈?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵姑宽,是天一觀的道長。 經(jīng)常有香客問我姜盈,道長低千,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任馏颂,我火速辦了婚禮示血,結果婚禮上,老公的妹妹穿的比我還像新娘救拉。我一直安慰自己难审,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布亿絮。 她就那樣靜靜地躺著告喊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪派昧。 梳的紋絲不亂的頭發(fā)上黔姜,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音蒂萎,去河邊找鬼秆吵。 笑死,一個胖子當著我的面吹牛五慈,可吹牛的內(nèi)容都是我干的纳寂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼泻拦,長吁一口氣:“原來是場噩夢啊……” “哼毙芜!你這毒婦竟也來了?” 一聲冷哼從身側響起争拐,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腋粥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘冲,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡金赦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了对嚼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夹抗。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纵竖,靈堂內(nèi)的尸體忽然破棺而出漠烧,到底是詐尸還是另有隱情,我是刑警寧澤靡砌,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布已脓,位于F島的核電站,受9級特大地震影響通殃,放射性物質(zhì)發(fā)生泄漏度液。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一画舌、第九天 我趴在偏房一處隱蔽的房頂上張望堕担。 院中可真熱鬧,春花似錦曲聂、人聲如沸霹购。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齐疙。三九已至,卻和暖如春旭咽,著一層夾襖步出監(jiān)牢的瞬間贞奋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工穷绵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轿塔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓请垛,卻偏偏與公主長得像催训,于是被迫代替她去往敵國和親洽议。 傳聞我的和親對象是個殘疾皇子宗收,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容