CAShapeLayer與UIBezierPath(加動畫)

前言

1. UIBezierPath: UIBezierPath是在 UIKit 中的一個類,繼承于NSObject,可以創(chuàng)建基于矢量的路徑.此類是Core Graphics框架關(guān)于path的一個OC封裝。使用此類可以定義常見的圓形灯蝴、多邊形等形狀 置侍。我們使用直線愉烙、灰榇俊(arc)來創(chuàng)建復(fù)雜的曲線形狀晚缩。每一個直線段或者曲線段的結(jié)束的地方是下一個的開始的地方笼才。每一個連接的直線或者曲線段的集合成為subpath漱受。一個UIBezierPath對象定義一個完整的路徑包括一個或者多個subpaths。
2. CAShapeLayer: 繼承于CALayer骡送。 每個CAShapeLayer對象都代表著將要被渲染到屏幕上的一個任意的形狀(shape)昂羡。具體的形狀由其path(類型為CGPathRef)屬性指定。 普通的CALayer是矩形摔踱,所以需要frame屬性虐先。CAShapeLayer它本身沒有形狀,它的形狀來源于其屬性path 派敷。CAShapeLayer有不同于CALayer的屬性蛹批,它從CALayer繼承而來的屬性在繪制時是不起作用的。

具體用法看代碼

僅僅使用UIBezierPath來繪圖的話篮愉,需要在view的drawRect方法里實現(xiàn),詳細(xì)可以看MyView的drawRect方法

//
//  MyView.m
//  CAShapeLayerAndUIBezierPath
//
//  Created by 蔡欣東 on 16/4/21.
//  Copyright ? 2016年 蔡欣東. All rights reserved.
//

#import "MyView.h"

@implementation MyView

- (void)drawRect:(CGRect)rect {
    [self simpleDraw];
    [self drawARCPath];
    [self drawTrianglePath];
    [self drawSecondBezierPath];
}

//畫圓角矩形
-(void)simpleDraw{
    UIBezierPath* path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(20, 20, 100, 100) cornerRadius:20];
    path.lineWidth = 5;
    
    //設(shè)置填充顏色
    UIColor* fillColor = [UIColor greenColor];
    [fillColor set];
    [path fill];
    
    //設(shè)置線的顏色般眉,需要在填充顏色之后設(shè)置
    UIColor* lineColor = [UIColor redColor];
    [lineColor set];
    [path stroke];
}


//畫圓弧
-(void)drawARCPath{
    UIBezierPath* path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(20, 150) radius:100 startAngle:0 endAngle:M_PI*90/180 clockwise:YES];
    
    //連接處的樣式
    path.lineCapStyle = kCGLineCapRound;
    //連接方式
    path.lineJoinStyle = kCGLineJoinRound;
    path.lineWidth = 5;
    
    UIColor* lineColor = [UIColor redColor];
    [lineColor set];
    [path stroke];
}

//畫三角形
-(void)drawTrianglePath{
    UIBezierPath* path = [UIBezierPath bezierPath];
    //設(shè)置起點(diǎn)
    [path moveToPoint:CGPointMake(20, 300)];
    [path addLineToPoint:CGPointMake(150, 400)];
    [path addLineToPoint:CGPointMake(20, 400)];
    [path closePath];
    
    path.lineWidth = 5;
    
    UIColor* fillColor = [UIColor greenColor];
    [fillColor set];
    [path fill];
    
    UIColor* lineColor = [UIColor redColor];
    [lineColor set];
    [path stroke];
    
    
}

//畫二次貝爾曲線
-(void)drawSecondBezierPath{
    UIBezierPath* path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(200, 150)];
    [path addQuadCurveToPoint:CGPointMake(200, 300) controlPoint:CGPointMake(50, 50)];
    path.lineWidth = 5;
    
    UIColor* lineColor = [UIColor redColor];
    [lineColor set];
    [path stroke];
}

@end

用CAShapeLayer和UIBezierPath畫圖,以及結(jié)合CAAnimation實現(xiàn)一個繪圖動畫

動畫效果:

gif1.gif
//
//  ViewController.m
//  CAShapeLayerAndUIBezierPath
//
//  Created by 蔡欣東 on 16/4/21.
//  Copyright ? 2016年 蔡欣東. All rights reserved.
//

#import "ViewController.h"
#import "MyView.h"
@interface ViewController (){
    CAShapeLayer *layer;
}

@end


@implementation ViewController


- (void)viewDidLoad {
    [super viewDidLoad];
    
    //僅僅使用UIBezierPath的話潜支,需要在view的drawRect方法里實現(xiàn),詳細(xì)可以看MyView的drawRect方法
//    CGFloat W = [UIScreen mainScreen].bounds.size.width;
//    CGFloat H = [UIScreen mainScreen].bounds.size.height;
//    MyView* myView = [[MyView alloc]initWithFrame:CGRectMake(0, 0, W, H)];
//    myView.backgroundColor = [UIColor whiteColor];
//    [self.view addSubview:myView];
    
    
    
    
    //CAShapeLayer和UIBezierPath畫圖
    
    layer = [CAShapeLayer layer];
    layer.fillColor = [UIColor clearColor].CGColor;
    layer.lineWidth =  20.0f;
    layer.lineCap = kCALineCapRound;
    layer.lineJoin = kCALineJoinRound;
    layer.strokeColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer];
    
    // 創(chuàng)建貝塞爾路徑
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(200, 200) radius:80 startAngle:0 endAngle:M_PI*2 clockwise:NO];
    
    
    // 關(guān)聯(lián)layer和貝塞爾路徑
    layer.path = path.CGPath;
    
    // 創(chuàng)建Animation
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    animation.fromValue = @(0.0);
    animation.toValue = @(1.0);
    layer.autoreverses = NO;
    animation.duration = 3.0;
    
    // 設(shè)置layer的animation
    [layer addAnimation:animation forKey:nil];
    animation.delegate = self;
    
    
    int count = 16;
    for (int i = 0; i<count; i++) {
        CAShapeLayer* lineLayer = [CAShapeLayer layer];
        lineLayer.fillColor = [UIColor clearColor].CGColor;
        lineLayer.strokeColor = [UIColor yellowColor].CGColor;
        lineLayer.lineWidth = 15.0f;
        lineLayer.lineCap = kCALineCapRound;
        lineLayer.lineJoin = kCALineCapRound;
        [self.view.layer addSublayer:lineLayer];
        
        UIBezierPath* path2 = [UIBezierPath bezierPath];
        int x = 200+100*cos(2*M_PI/count*i);
        int y = 200-100*sin(2*M_PI/count*i);
        int len = 50;
        [path2 moveToPoint:CGPointMake(x, y)];
        [path2 addLineToPoint:CGPointMake(x+len*cos(2*M_PI/count*i), y-len*sin(2*M_PI/count*i))];
        lineLayer.path = path2.CGPath;
        [lineLayer addAnimation:animation forKey:nil];
    }

}

//animation結(jié)束回調(diào)
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
    NSLog(@"yes");
    layer.fillColor = [UIColor redColor].CGColor;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
}

@end

Demo地址:https://github.com/caixindong/SomeDemoForYou

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甸赃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冗酿,更是在濱河造成了極大的恐慌埠对,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裁替,死亡現(xiàn)場離奇詭異项玛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)弱判,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門襟沮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事开伏“虻” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵固灵,是天一觀的道長捅伤。 經(jīng)常有香客問我,道長巫玻,這世上最難降的妖魔是什么丛忆? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮仍秤,結(jié)果婚禮上熄诡,老公的妹妹穿的比我還像新娘。我一直安慰自己诗力,他們只是感情好粮彤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姜骡,像睡著了一般导坟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圈澈,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天惫周,我揣著相機(jī)與錄音,去河邊找鬼康栈。 笑死递递,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啥么。 我是一名探鬼主播登舞,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悬荣!你這毒婦竟也來了菠秒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤氯迂,失蹤者是張志新(化名)和其女友劉穎践叠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚼蚀,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禁灼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轿曙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄捕。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡僻孝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出守谓,到底是詐尸還是另有隱情穿铆,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布分飞,位于F島的核電站悴务,受9級特大地震影響睹限,放射性物質(zhì)發(fā)生泄漏譬猫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一羡疗、第九天 我趴在偏房一處隱蔽的房頂上張望染服。 院中可真熱鬧,春花似錦叨恨、人聲如沸柳刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉颗。三九已至,卻和暖如春送矩,著一層夾襖步出監(jiān)牢的瞬間蚕甥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工栋荸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菇怀,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓晌块,卻偏偏與公主長得像爱沟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匆背,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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