UIBezierPath和CAShapeLayer結(jié)合實現(xiàn)畫圖

UIBezierPath :使用UIBezierPath類可以創(chuàng)建基于矢量的路徑, 這個類在UIKit中. 此類是Core Graphics框架關(guān)于path的一個封裝. 使用此類可以定義簡單的形狀, 如橢圓或者矩形, 或者有多個直線和曲線段組成的形狀.

CAShapeLayer:CAShapeLayer 是 CALayer 的子類, 但是比 CALayer 更靈活, 可以畫出各種圖形. 每個CAShapeLayer對象都代表著將要被渲染到屏幕上的一個任意的形狀(shape). 具體的形狀由其path(類型為CGPathRef)屬性指定.

但是, CAShapeLayer 有一條屬性 path , 用這個屬性配合上 UIBezierPath 這個類使用可以達到很好的效果.

首先,說明下 UIBezierPath貝塞爾弧線常用方法

1 . 根據(jù)一個矩形畫曲線

+ (UIBezierPath *)bezierPathWithRect:(CGRect)rect

例: 畫矩形

矩形.gif
   CAShapeLayer *layer = [CAShapeLayer layer];
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(130, 10, 100, 80)];
    layer.path = path.CGPath;
    //填充顏色
    layer.fillColor = [UIColor clearColor].CGColor;
    //邊框顏色
    layer.strokeColor = [UIColor redColor].CGColor;
    
    [self.displayView.layer addSublayer:layer];
    

2 . 根據(jù)矩形框的內(nèi)切圓畫曲線

+ (UIBezierPath *)bezierPathWithOvalInRect:(CGRect)rect

//根據(jù)矩形畫帶圓角的曲線

+ (UIBezierPath *)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius

//在矩形中, 可以針對四角中的某個角加圓角

+ (UIBezierPath *)bezierPathWithRoundedRect:(CGRect)rect byRoundingCorners:(UIRectCorner)corners cornerRadii:(CGSize)cornerRadii

參數(shù):

corners:枚舉值, 可以選擇某個角

cornerRadii:圓角的大小

//以某個中心點畫弧線

+ (UIBezierPath *)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise;

參數(shù):

center:弧線中心點的坐標

radius:弧線所在圓的半徑

startAngle:弧線開始的角度值

endAngle:弧線結(jié)束的角度值

clockwise:是否順時針畫弧線

例: 通過弧度畫圓

畫圓.gif
//這個畫出來是一個圓形
    CAShapeLayer *layer = [CAShapeLayer layer];
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 10, 100, 100) cornerRadius:50];
    layer.path = path.CGPath;
    layer.fillColor = [UIColor orangeColor].CGColor;
    layer.strokeColor = [UIColor blueColor].CGColor;
    [self.displayView.layer addSublayer:layer];
//這個畫出來是帶圓角的矩形
    CAShapeLayer *layer1 = [CAShapeLayer layer];
    UIBezierPath *path1 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(120, 10, 100, 100) byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(10, 10)];
    layer1.path = path1.CGPath;
    layer1.fillColor = [UIColor clearColor].CGColor;
    layer1.strokeColor = [UIColor redColor].CGColor;
    [self.displayView.layer addSublayer:layer1];
//這是一段弧
CAShapeLayer *layer2 = [CAShapeLayer layer];
    /*
     param: ArcCenter 圓心 radius 半徑 startAngle/endAngle 開始 結(jié)束角度 clockwise  YES 順時針 NO 逆時針
     */
    UIBezierPath *path2 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(280, 60) radius:50 startAngle:0 endAngle:M_PI clockwise:YES];
    layer2.path = path2.CGPath;
    layer2.fillColor = [UIColor clearColor].CGColor;
    layer2.strokeColor = [UIColor brownColor].CGColor;
    [self.displayView.layer addSublayer:layer2];

對于涉及到角度的問題,起始角和結(jié)束角备籽,這里的角度使使用弧度制來表示可以參考這個:

1455416085288481.png

3 . 畫二元曲線, 一般和moveToPoint配合使用

- (void)addQuadCurveToPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint

參數(shù):

endPoint:曲線的終點

controlPoint:畫曲線的基準點

//以三個點畫一段曲線, 一般和moveToPoint配合使用

- (void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2

參數(shù):

endPoint:曲線的終點

controlPoint1:畫曲線的第一個基準點

controlPoint2:畫曲線的第二個基準點

例: 雙點控制曲線

雙點控制曲線.gif
//貝塞爾曲線的畫法是由起點,終點,控制點 三個參數(shù)來畫的
    CGPoint startPoint   = CGPointMake(50, 70);
    CGPoint endPoint     = CGPointMake(300, 70);
    CGPoint controlPoint1 = CGPointMake(112.5, 10);
    CGPoint controlPoint2 = CGPointMake(237.5, 130);
    
    CALayer *layer1 = [CALayer layer];
    layer1.frame = CGRectMake(startPoint.x, startPoint.y, 5, 5);
    layer1.backgroundColor = [UIColor redColor].CGColor;
    
    CALayer *layer2 = [CALayer layer];
    layer2.frame = CGRectMake(endPoint.x, endPoint.y, 5, 5);
    layer2.backgroundColor = [UIColor redColor].CGColor;
    
    CALayer *layer3 = [CALayer layer];
    layer3.frame = CGRectMake(controlPoint1.x, controlPoint1.y, 5, 5);
    layer3.backgroundColor = [UIColor redColor].CGColor;
    
    CALayer *layer4 = [CALayer layer];
    layer4.frame = CGRectMake(controlPoint2.x, controlPoint2.y, 5, 5);
    layer4.backgroundColor = [UIColor redColor].CGColor;
    
    UIBezierPath *path = [UIBezierPath bezierPath];
    CAShapeLayer *layer = [CAShapeLayer layer];
    
    [path moveToPoint:startPoint];
   
   //在這里使用兩個控制點
    [path addCurveToPoint:endPoint controlPoint1:controlPoint1 controlPoint2:controlPoint2];
    
    layer.path = path.CGPath;
    layer.fillColor = [UIColor clearColor].CGColor;
    layer.strokeColor = [UIColor blackColor].CGColor;
    
    [self.displayView.layer addSublayer:layer];
    [self.displayView.layer addSublayer:layer1];
    [self.displayView.layer addSublayer:layer2];
    [self.displayView.layer addSublayer:layer3];
    [self.displayView.layer addSublayer:layer4];

當然, 無聊時也可以繪個字

字.gif
    //設置起點坐標
    CGFloat startX = 50;
    CGFloat startY = 50;
    
    CAShapeLayer *layer = [CAShapeLayer layer];
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    [path moveToPoint:CGPointMake(startX, startY)];
    [path addLineToPoint:CGPointMake(startX+50, startY)];
    
    [path addLineToPoint:CGPointMake(startX+25, startY+25)];
    
    [path addArcWithCenter:CGPointMake(startX+25, startY+50) radius:25 startAngle:M_PI*3/2 endAngle:M_PI clockwise:YES];
    
    [path moveToPoint:CGPointMake(startX, startY+25)];
    [path addLineToPoint:CGPointMake(startX, startY+150)];
    
    //
    [path moveToPoint:CGPointMake(startX+60, startY)];
    [path addLineToPoint:CGPointMake(startX+120, startY)];
    
    [path moveToPoint:CGPointMake(startX+95, startY-50)];
    [path addQuadCurveToPoint:CGPointMake(startX+60, startY+50) controlPoint:CGPointMake(startX+100, startY)];
    
    [path addLineToPoint:CGPointMake(startX+130, startY+50)];
    
    [path moveToPoint:CGPointMake(startX+95, startY+25)];
    [path addLineToPoint:CGPointMake(startX+95, startY+150)];
    [path addLineToPoint:CGPointMake(startX+60, startY+125)];
    
    [path moveToPoint:CGPointMake(startX+80, startY+60)];
    [path addLineToPoint:CGPointMake(startX+35, startY+145)];
    
    [path moveToPoint:CGPointMake(startX+100, startY+60)];
    [path addLineToPoint:CGPointMake(startX+140, startY+145)];
    
    //
    layer.path = path.CGPath;
    layer.fillColor = [UIColor clearColor].CGColor;
    layer.strokeColor = [UIColor redColor].CGColor;
    
    [self.displayView.layer addSublayer:layer];

demo 下載點這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末精续,一起剝皮案震驚了整個濱河市秆撮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌轮听,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚕涤,居然都是意外死亡,警方通過查閱死者的電腦和手機铣猩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門揖铜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人达皿,你說我怎么就攤上這事天吓。” “怎么了峦椰?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵龄寞,是天一觀的道長。 經(jīng)常有香客問我汤功,道長物邑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮色解,結(jié)果婚禮上茂嗓,老公的妹妹穿的比我還像新娘。我一直安慰自己科阎,他們只是感情好在抛,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萧恕,像睡著了一般刚梭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上票唆,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天朴读,我揣著相機與錄音,去河邊找鬼走趋。 笑死衅金,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的簿煌。 我是一名探鬼主播氮唯,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姨伟!你這毒婦竟也來了惩琉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤夺荒,失蹤者是張志新(化名)和其女友劉穎瞒渠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體技扼,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡伍玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剿吻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窍箍。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丽旅,靈堂內(nèi)的尸體忽然破棺而出椰棘,到底是詐尸還是另有隱情,我是刑警寧澤魔招,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布晰搀,位于F島的核電站五辽,受9級特大地震影響办斑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一乡翅、第九天 我趴在偏房一處隱蔽的房頂上張望鳞疲。 院中可真熱鬧,春花似錦蠕蚜、人聲如沸尚洽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腺毫。三九已至,卻和暖如春挣柬,著一層夾襖步出監(jiān)牢的瞬間潮酒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工邪蛔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留急黎,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓侧到,卻偏偏與公主長得像勃教,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匠抗,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

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