CAShapeLayer初探

轉(zhuǎn)自: iOS開(kāi)發(fā)之CAShapeLayer初探
拓展: CAShapeLayer

一、CAShapeLayer簡(jiǎn)介

CAShapeLayer屬于QuartzCore框架章郁,繼承自CALayer。CAShapeLayer是在坐標(biāo)系內(nèi)繪制貝塞爾曲線的锦援,通過(guò)繪制貝塞爾曲線儒恋,設(shè)置shape(形狀)的path(路徑),從而繪制各種各樣的圖形以及不規(guī)則圖形黄刚。因此捎谨,使用CAShapeLayer需要與UIBezierPath一起使用。
UIBezierPath類允許你在自定義的 View 中繪制和渲染由直線和曲線組成的路徑.憔维。你可以在初始化的時(shí)候直接為你的UIBezierPath指定一個(gè)幾何圖形涛救。
通俗點(diǎn)就是UIBezierPath用來(lái)指定繪制圖形路徑,而CAShapeLayer就是根據(jù)路徑來(lái)繪圖的业扒。

二检吆、CAShapeLayer屬性介紹
1、[CAShapeLayer layer].path
2程储、[CAShapeLayer layer].fillColor
3蹭沛、[CAShapeLayer layer].fillRule
4臂寝、[CAShapeLayer layer].strokeColor
5、[CAShapeLayer layer].strokeStart與
[CAShapeLayer layer].strokeEnd
6摊灭、[CAShapeLayer layer]. lineWidth與
[CAShapeLayer layer].miterLimit
7咆贬、[CAShapeLayer layer]. lineCap與
[CAShapeLayer layer].lineJoin
8、[CAShapeLayer layer]. lineDashPhase與
[CAShapeLayer layer]. lineDashPattern

三帚呼、開(kāi)始繪制
1掏缎、顏色說(shuō)明---矩形為例

CAShapeLayer *layer = [CAShapeLayer layer];
layer.frame = CGRectMake(375/2-50, 667/2-50, 100, 100);
//設(shè)置背景色
layer.backgroundColor = [UIColor cyanColor].CGColor;
//設(shè)置描邊色
layer.strokeColor = [UIColor blackColor].CGColor;
//設(shè)置填充色
layer.fillColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:layer];
1.png

讀者估計(jì)會(huì)納悶,為啥設(shè)置的描邊色與填充色沒(méi)有作用煤杀,這是因?yàn)檫@兩種顏色需要UIBezierPath來(lái)繪制路徑眷蜈,然后使用CAShapeLayer進(jìn)行渲染,所以接下來(lái)就就在上面的那段代碼下簡(jiǎn)單的添加一個(gè)UIBezierPath類路徑(溫馨提示沈自,layer的背景與這兩種顏色最好不要共用)酌儒。

UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)];
layer.path = path.CGPath;
2.png

2、繪制shape

//繪制矩形 
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)]; 
//繪制圓形路徑 
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 100, 100)]; 
//繪制自帶圓角的路徑 
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100) cornerRadius:30]; 
//指定矩形某一個(gè)角加圓角(代碼示例為左上角) 
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100) byRoundingCorners:UIRectCornerTopLeft cornerRadii:CGSizeMake(50, 50)];
shape.png

3酥泛、繪制曲線(正弦曲線為例)
先來(lái)兩張效果圖:


3.png
4.png

說(shuō)明:圖4只是比圖5多了填充色而已今豆。

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBezierPath *path = [self startPoint:CGPointMake(50, 300) endPoint:CGPointMake(200, 300) controlPoint:CGPointMake(125, 200)];
    UIBezierPath *path1 = [self startPoint:CGPointMake(200, 300) endPoint:CGPointMake(350, 300) controlPoint:CGPointMake(275, 400)];
    CAShapeLayer *layer = [self createShapeLayer:[UIColor orangeColor]];
    layer.path = path.CGPath;
    CAShapeLayer *layer1 = [self createShapeLayer:[UIColor greenColor]];
    layer1.path = path1.CGPath;
}

/** 配置貝塞爾曲線
 @param startPoint 起始點(diǎn)
 @param endPoint 結(jié)束點(diǎn)
 @param controlPoint 控制點(diǎn)
 @return UIBezierPath對(duì)象
 */
- (UIBezierPath *)startPoint:(CGPoint)startPoint endPoint:(CGPoint)endPoint controlPoint:(CGPoint)controlPoint{
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:startPoint];
    [path addQuadCurveToPoint:endPoint controlPoint:controlPoint];
    return path;
}
- (CAShapeLayer *)createShapeLayer:(UIColor *)color {
    CAShapeLayer *layer = [CAShapeLayer layer];
    // layer.frame = CGRectMake(0, 0, 50, 50);
    //設(shè)置背景色
    // layer.backgroundColor = [UIColor cyanColor].CGColor;
    //設(shè)置描邊色
    layer.strokeColor = [UIColor blackColor].CGColor;
    //設(shè)置填充色
    layer.fillColor = color.CGColor;
    [self.view.layer addSublayer:layer];
    return layer;
}

4、曲線動(dòng)畫(huà)
1)柔袁、直線

6.gif
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(50, 667/2)];
[path addLineToPoint:CGPointMake(375/2, 667/2)];
[path addLineToPoint:CGPointMake(300, 667/2)];

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
//每次動(dòng)畫(huà)的持續(xù)時(shí)間
animation.duration = 5;
//動(dòng)畫(huà)起始位置
animation.fromValue = @(0);
//動(dòng)畫(huà)結(jié)束位置
animation.toValue = @(1);
//動(dòng)畫(huà)重復(fù)次數(shù)
animation.repeatCount = 100;

CAShapeLayer *layer = [self createShapeLayer:[UIColor orangeColor]];
layer.path = path.CGPath;
layer.lineWidth = 2.0;
//設(shè)置圖形的弧度
// layer.strokeStart = 0;
// layer.strokeEnd = 0;
[layer addAnimation:animation forKey:@"strokeEndAnimation"];
//注:由于UIBezierPath已經(jīng)設(shè)置路徑呆躲,所以動(dòng)畫(huà)的路徑就不需要再次設(shè)置,
//只需要設(shè)置起始0與結(jié)束1就行捶索,有需要可以設(shè)置動(dòng)畫(huà)結(jié)束后是否需要返回原位置插掂。

2)、曲線

7.gif
UIBezierPath *path = [UIBezierPath bezierPath];
//起始點(diǎn)
[path moveToPoint:CGPointMake(50, 667/2)];
//結(jié)束點(diǎn)腥例、兩個(gè)控制點(diǎn)
[path addCurveToPoint:CGPointMake(330, 667/2) controlPoint1:CGPointMake(125, 200) controlPoint2:CGPointMake(185, 450)];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
animation.duration = 5;
animation.fromValue = @(0);
animation.toValue = @(1);
animation.repeatCount = 100;
CAShapeLayer *layer = [self createShapeLayer:[UIColor clearColor]];
layer.path = path.CGPath;
layer.lineWidth = 2.0;
[layer addAnimation:animation forKey:@"strokeEndAnimation"];

3)辅甥、圓形
筆者目前的一個(gè)項(xiàng)目中就用到了這個(gè)功能。直接貼一張效果圖:

8.gif

其實(shí)實(shí)現(xiàn)效果很簡(jiǎn)單燎竖,只是把邊線加粗了然后實(shí)現(xiàn)動(dòng)畫(huà)就可以了璃弄,還有一種思路就是畫(huà)兩個(gè)圓,截取中間的環(huán)构回,對(duì)大圓進(jìn)行顏色漸變填充夏块,小圓clear所有顏色再去實(shí)現(xiàn)動(dòng)畫(huà)也能達(dá)到這樣的效果。

UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(375/2-100, 667/2-100, 200, 200)];
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
animation.duration = 9.0;
animation.fromValue = @(0);
animation.toValue = @(1);
animation.repeatCount = 100;
CAShapeLayer *layer = [self createShapeLayer:[UIColor clearColor]];
layer.path = path.CGPath;
layer.lineWidth = 25.0;
//圓的起始位置纤掸,默認(rèn)為0
layer.strokeStart = 0;
//圓的結(jié)束位置脐供,默認(rèn)為1,如果值為0.75借跪,則顯示3/4的圓
layer.strokeEnd = 1;
[layer addAnimation:animation forKey:@"strokeEndAnimation"];

四政己、小結(jié)

iOS中畫(huà)圖類還有CoreGraphics,但筆者比較喜歡使用CAShapeLayer掏愁,且CAShapeLayer一般是與UIBezierPath連用的歇由,如果有動(dòng)畫(huà)功能的話卵牍,還可以加上CABasicAnimation。這篇文章只是對(duì)CAShapeLayer和UIBezierPath類如何使用和主要功能實(shí)現(xiàn)做了簡(jiǎn)要的說(shuō)明印蓖,還有一些項(xiàng)目中可能經(jīng)常用到的圓形進(jìn)度圈辽慕、下載圈,或者某些特效的實(shí)現(xiàn)赦肃,筆者可能在下一篇文章中簡(jiǎn)析封裝步驟與代碼實(shí)現(xiàn),有需要的讀者多多關(guān)注公浪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末他宛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子欠气,更是在濱河造成了極大的恐慌厅各,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件预柒,死亡現(xiàn)場(chǎng)離奇詭異队塘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)宜鸯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)憔古,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淋袖,你說(shuō)我怎么就攤上這事鸿市。” “怎么了即碗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵焰情,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我剥懒,道長(zhǎng)内舟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任初橘,我火速辦了婚禮验游,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘壁却。我一直安慰自己批狱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布展东。 她就那樣靜靜地躺著赔硫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盐肃。 梳的紋絲不亂的頭發(fā)上爪膊,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天权悟,我揣著相機(jī)與錄音,去河邊找鬼推盛。 笑死峦阁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耘成。 我是一名探鬼主播榔昔,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘪菌!你這毒婦竟也來(lái)了撒会?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤师妙,失蹤者是張志新(化名)和其女友劉穎诵肛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體默穴,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怔檩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓄诽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薛训。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖若专,靈堂內(nèi)的尸體忽然破棺而出许蓖,到底是詐尸還是另有隱情,我是刑警寧澤调衰,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布膊爪,位于F島的核電站,受9級(jí)特大地震影響嚎莉,放射性物質(zhì)發(fā)生泄漏米酬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一趋箩、第九天 我趴在偏房一處隱蔽的房頂上張望赃额。 院中可真熱鬧,春花似錦叫确、人聲如沸跳芳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飞盆。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吓歇,已是汗流浹背孽水。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留城看,地道東北人女气。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像测柠,于是被迫代替她去往敵國(guó)和親炼鞠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 一轰胁、CAShapeLayer簡(jiǎn)介 CAShapeLayer屬于QuartzCore框架簇搅,繼承自CALayer。CA...
    施憶閱讀 24,525評(píng)論 7 73
  • CAShapeLayer 是什么软吐?CAShapeLayer 是一個(gè)繼承自 CALayer 的一個(gè)子Layer。 為...
    人話博客閱讀 1,976評(píng)論 0 50
  • 一吟税、CAShapeLayer簡(jiǎn)介 CAShapeLayer屬于QuartzCore框架凹耙,繼承自CALayer。CA...
    _小浪蹄子閱讀 3,376評(píng)論 0 3
  • 目錄 前言所有的CALayer子類CAShapeLayer位圖簡(jiǎn)介矢量圖簡(jiǎn)介構(gòu)建CAShapeLayer貝塞爾曲線...
    路飛_Luck閱讀 578評(píng)論 2 4
  • 好像突破了一個(gè)關(guān)卡肠仪,就像游戲通關(guān)肖抱,總有一些關(guān)卡是需要反復(fù)努力才能通過(guò)的。有些心結(jié)异旧、有些瓶頸意述,也是如此。 我和他其實(shí)...
    Rene_Yu閱讀 220評(píng)論 0 0