CAShapeLayer的使用

原文鏈接:http://blog.csdn.net/mumubumaopao/article/details/52005730

之前在項(xiàng)目中,經(jīng)常會需要設(shè)置圓角的一些屬性或者一些動畫,經(jīng)常會涉及到layer層的東西,而如果需要我們自定義圖形的話,那么我們經(jīng)常就會用到CAShapeLayer來創(chuàng)建了.而且經(jīng)常與其一起搭配使用的是UIBezierPath.這兩天比較閑,就寫了這篇博客來記錄下自己寫的一個(gè)小Demo,雖然使用起來很簡單,但是偶爾想不起來如何設(shè)置的話,也是一件很糾結(jié)的事情…

如果我們要繪制一個(gè)幾何圖形的話,我們可以使用簡單的UIBezierPath來繪制,但是這樣的話就必須在UIView的drawRect方法里來繪制或者調(diào)用,但是drawRect:方法不能手動顯示調(diào)用,必須通過調(diào)用setNeedsDisplay或者setNeedsDisplayInRect拱绑,讓系統(tǒng)自動調(diào)該方法,如果我們需要即時(shí)的繪圖的話,這對我們來說難免是一個(gè)約束,但是使用CAShapeLayer和UIBezierPath的話,則可以讓我們放開雙手,隨時(shí)隨地的進(jìn)行繪圖.該博客只是示范CAShapeLayer的簡單使用,下一篇博客我會具體說一下UIBezierPath的使用.

Demo效果圖

CAShaperLayer簡介及使用注意

CAShapeLayer是CALayer的子類,但是要比CALayer更加的靈活,也為我們提供了更多樣的設(shè)置元素.使用CAShapeLayer的話,需要使用一個(gè)給定的Path來設(shè)置他的繪圖路線,這個(gè)path就是由UIBezierPath來提供的.

CAShapeLayer在初始化時(shí)也需要給一個(gè)frame值,但是,它本身沒有形狀,它的形狀來源于你給定的一個(gè)path,然后它去取CGPath值,它與CALayer有著很大的區(qū)別廢話不多說,看代碼,代碼很簡單,我有詳細(xì)的注解.看代碼是最好的交流方式.

代碼講解

首先創(chuàng)建創(chuàng)建CALayer對象并且設(shè)置frame,將shapeLayer放在視圖的中心

CAShapeLayer *shapeLayer = [CAShapeLayer layer];

shapeLayer.frame = CGRectMake(0, 0, 200, 200);

shapeLayer.position = self.view.center;

使用貝塞爾曲線繪制一個(gè)圓形的路徑,并且將shapeLayer的路徑設(shè)置為繪制好的貝塞爾曲線(圓形)

UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0, 0, 200, 200)];

path.lineCapStyle = kCGLineCapRound; //貝塞爾線段端點(diǎn)格式 (該demo暫不做詳細(xì)介紹 請參考我的其他博文有詳細(xì)介紹)

path.lineJoinStyle = kCGLineJoinRound; //貝塞爾線段連接點(diǎn)格式

shapeLayer.path = path.CGPath;

設(shè)置填充顏色和背景顏色

shapeLayer.fillColor = [UIColor redColor].CGColor;

shapeLayer.backgroundColor = [UIColor greenColor].CGColor;

設(shè)置邊框?qū)挾群瓦吙蝾伾?這個(gè)地方說的是住背景邊框,并不是我們繪制path

shapeLayer.borderWidth = 4;

shapeLayer.borderColor = [UIColor blueColor].CGColor;

設(shè)置陰影的顏色以及偏移量和透明度,透明度的屬性默認(rèn)是0.0 所以如果我們不設(shè)置透明度的屬性的話,那么將看不到陰影

,需要說明的是,我們添加的這個(gè)陰影暫時(shí)是看不到效果的,原因我會在后面講解.

shapeLayer.shadowColor = [UIColor grayColor].CGColor;

shapeLayer.shadowOffset = CGSizeMake(5, 15);

shapeLayer.shadowOpacity = 0.6;

設(shè)置圓角屬性,需要注意的是,cornerRadius設(shè)置的是圓角的值,maskToBounds設(shè)置的是切除超過主視圖范圍的內(nèi)容,在UIView里這一屬性對應(yīng)的方法是clipsToBounds.在后面我會具體講解這個(gè)概念

shapeLayer.cornerRadius = 13;

shapeLayer.masksToBounds = true;

值得一提的是,當(dāng)我們設(shè)置masksToBounds屬性為true的時(shí)候,圖層屬性的混合體被指定為在未預(yù)合成之前不能直接在屏幕中繪制综芥,所以就需要屏幕外渲染被喚起,這就是我們平常說的離屏渲染.如果說需要渲染的控件不多的話,那么對程序的性能不會咋造成太大的影響,但是如果需要渲染的控件很多的話,比如在tableView里需要渲染很多控件,那么就會導(dǎo)致界面卡頓的現(xiàn)象十分嚴(yán)重.關(guān)于離屏渲染這個(gè)問題,我會在以后的博客中進(jìn)行討論.

設(shè)置路徑寬度(使用貝塞爾曲線繪制的路徑寬度)以及路徑顏色

shapeLayer.lineWidth = 20;

shapeLayer.strokeColor = [UIColor blackColor].CGColor;

將主圖層添加到視圖圖層上去并顯示出來

[self.view.layer addSublayer:shapeLayer];

代碼中容易混淆的地方

shapeLayer.position = self.view.center;

只有l(wèi)ayer層才有position屬性,UIView有center屬性,我們使用view.layer.position也可以獲取到layer的position.這行代碼的意思是,將自己創(chuàng)建的shapeLayer放在父視圖的中央位置.

我們使用shapeLayer.masksToBounds對我們創(chuàng)建的shapeLayer切了圓角,這個(gè)操作主要是將超出主視圖顯示區(qū)域的內(nèi)容切除掉,你肯定很奇怪為什么我們添加了圓角但是看不到效果,其實(shí)是因?yàn)槲覀兲砑拥年幱笆浅龈敢晥D范圍的,而且我們又將masksToBounds設(shè)置為true,這就意味著,添加的陰影將會被切除掉,因?yàn)樗浅龈敢晥D范圍的.

如果我們設(shè)置這個(gè)屬性的為false的話,那么超出主視圖范圍的屬性也是可見的,效果如下所示:

同時(shí)我們可以看到,由于設(shè)置的path比較寬(shapeLayer.lineWidth = 20),在我們設(shè)置完maskToBouns屬性之后,超出主視圖的邊線也被切除掉了.

如下所示:

經(jīng)過我的實(shí)驗(yàn),如果我們設(shè)置路徑寬度為20的話,那么當(dāng)繪制的時(shí)候,路徑會向內(nèi)外各延伸10個(gè)單位,然后完成路徑的繪制,比如我們繪制一個(gè)內(nèi)切于正方形的圓,設(shè)置路線寬度為20,那么效果如下所示:

4 . 源碼

想看效果的話可以去gitHub上下載我的工程:https://github.com/TheRuningAnt/TestCAShapeLayer.git

或者自行拷貝代碼,粘貼運(yùn)行,各位看官請便:

CAShapeLayer *shapeLayer = [CAShapeLayer layer];//創(chuàng)建CALayer對象shapeLayer.frame= CGRectMake(0,0,200,200);//設(shè)置frameshapeLayer.position=self.view.center;//將shapeLayer放在視圖的中心UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0,0,200,200)];//使用貝塞爾曲線繪制一個(gè)圓形的路徑path.lineCapStyle= kCGLineCapRound;//貝塞爾線段端點(diǎn)格式? (該demo暫不做詳細(xì)介紹 請參考我的其他博文有詳細(xì)介紹)path.lineJoinStyle= kCGLineJoinRound;//貝塞爾線段連接點(diǎn)格式 (該demo暫不做詳細(xì)介紹 請參考我的其他博文有詳細(xì)介紹)shapeLayer.path= path.CGPath;//將shapeLayer的路徑設(shè)置為繪制好的貝塞爾曲線(圓形)shapeLayer.fillColor= [UIColorredColor].CGColor;//設(shè)置填充顏色shapeLayer.backgroundColor= [UIColorgreenColor].CGColor;//設(shè)置背景顏色shapeLayer.borderWidth=4;//設(shè)置邊框?qū)挾萻hapeLayer.borderColor= [UIColorblueColor].CGColor;//設(shè)置邊框顏色shapeLayer.shadowColor= [UIColorgrayColor].CGColor;//設(shè)置陰影顏色shapeLayer.shadowOffset= CGSizeMake(5,15);//設(shè)置陰影偏移量shapeLayer.shadowOpacity=0.6;//設(shè)置陰影的透明度? 默認(rèn)為透明的 0.0shapeLayer.cornerRadius=13;//設(shè)置圓角shapeLayer.masksToBounds=true;//將超出主圖層范圍的內(nèi)容切掉? 在UIView里這一屬性對應(yīng)的方法是clipsToBoundsshapeLayer.lineWidth=20;//設(shè)置路徑寬度(使用貝塞爾曲線繪制的路徑寬度)shapeLayer.strokeColor= [UIColorblackColor].CGColor;//設(shè)置路徑顏色[self.view.layeraddSublayer:shapeLayer];//將主圖層添加到視圖圖層上去并顯示出來

加入審核被拒交流群,一起交流審核上架經(jīng)驗(yàn)吧~~ 群號:689757099

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市止剖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌策菜,老刑警劉巖额各,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件国觉,死亡現(xiàn)場離奇詭異,居然都是意外死亡虾啦,警方通過查閱死者的電腦和手機(jī)麻诀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來傲醉,“玉大人蝇闭,你說我怎么就攤上這事⌒杵担” “怎么了丁眼?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昭殉。 經(jīng)常有香客問我苞七,道長,這世上最難降的妖魔是什么挪丢? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任蹂风,我火速辦了婚禮,結(jié)果婚禮上乾蓬,老公的妹妹穿的比我還像新娘惠啄。我一直安慰自己,他們只是感情好任内,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布撵渡。 她就那樣靜靜地躺著,像睡著了一般死嗦。 火紅的嫁衣襯著肌膚如雪趋距。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天越除,我揣著相機(jī)與錄音节腐,去河邊找鬼。 笑死摘盆,一個(gè)胖子當(dāng)著我的面吹牛翼雀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孩擂,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狼渊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了类垦?” 一聲冷哼從身側(cè)響起囤锉,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤坦弟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后官地,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烙懦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年驱入,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氯析。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亏较,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掩缓,到底是詐尸還是另有隱情雪情,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布你辣,位于F島的核電站巡通,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舍哄。R本人自食惡果不足惜宴凉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望表悬。 院中可真熱鬧弥锄,春花似錦、人聲如沸蟆沫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饭庞。三九已至戒悠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間但绕,已是汗流浹背救崔。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捏顺,地道東北人六孵。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像幅骄,于是被迫代替她去往敵國和親劫窒。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

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