iOS-核心動(dòng)畫詳解之CALayer

1. CALayer的基本操作.

1. CALayer簡(jiǎn)介:

CALayer我們又稱為層解寝,在每個(gè)UIView內(nèi)部都有一個(gè)layer的屬性,UIView之所以能夠顯示碍沐,就是因?yàn)樗锩嬗衛(wèi)ayer層,才具有顯示的功能,我們通過操作CALayer對(duì)象,可以很方便地調(diào)整UIView的一些外觀屬性席揽,例如可以給UIView設(shè)置陰影,圓角,邊框等等...

2. 操作layer改變UIView外觀.

2.1 設(shè)置陰影

//默認(rèn)圖層是有陰影的, 只不過是透明的。1為不透明谓厘,0為透明
_RedView.layer.shadowOpacity = 1;
//設(shè)置陰影的偏移量
self.imageV.layer.shadowOffset = CGSizeMake(-30, -10);
//設(shè)置陰影的模糊程度
self.imageV.layer.shadowRadius = 10;
//設(shè)置陰影的圓角
_RedView.layer.shadowRadius  =10;
//設(shè)置陰影的顏色,把UIKit轉(zhuǎn)換成CoreGraphics框架,用.CG開頭
_RedView.layer.shadowColor = [UIColor blueColor].CGColor;

2.2.設(shè)置邊框

設(shè)置圖層邊框,在圖層中使用CoreGraphics的CGColorRef
//設(shè)置邊框的顏色
_RedView.layer.borderColor = [UIColor whiteColor].CGColor;
//設(shè)置邊框的寬度
_RedView.layer.borderWidth = 2;

2.3.設(shè)置圓角

圖層的圓角半徑,圓角半徑為寬度的一半, 就是一個(gè)圓
_RedView.layer.cornerRadius = 50;

3. 操作layer改變UIImageView的外觀.

3.1 設(shè)置陰影

//UIView本身就自帶陰影效果,它是透明.
_imageView.layer.shadowOpacity = 1;
//設(shè)置陰影的偏移量
_imageView.layer.shadowOffset = CGSizeMake(-30, -10);
//設(shè)置陰影的模糊程度
_imageView.layer.shadowRadius = 10;
//設(shè)置陰影的顏色
_imageView.layer.shadowColor = [UIColor blueColor].CGColor;

3.2 設(shè)置圖形邊框

//設(shè)置邊框?qū)挾?_imageView.layer.borderWidth = 2;
//設(shè)置邊框顏色
_imageView.layer.borderColor = [UIColor whiteColor].CGColor;

3.3 設(shè)置圖片的圓角半徑

//我們?cè)O(shè)置的所有l(wèi)ayer的屬性只作用在根層上幌羞,根層設(shè)置為圓形后,其上面的圖片并不會(huì)改變竟稳,因此需要裁剪属桦。
_imageView.layer.cornerRadius = 50;
//裁剪,超出裁剪區(qū)域的部分全部裁剪掉
_imageView.layer.masksToBounds = YES;

注意:UIImageView當(dāng)中Image并不是直接添加在根層上面的.而是添加在layer當(dāng)中的contents層里.
我們?cè)O(shè)置層的所有屬性它只作用在根層上面.對(duì)contents里面的東西并不起作用.
所以我們看不到圖片有圓角的效果.
想要讓圖片有圓角的效果.可以把masksToBounds這個(gè)屬性設(shè)為YES.把就會(huì)把超過根層以外的東西都給裁剪掉.

4. layer的 CATransform3D屬性.

只有旋轉(zhuǎn)的時(shí)候才可以看出3D的效果.

//x,y,z 分別代表x,y,z軸.      
//旋轉(zhuǎn)
CATransform3DMakeRotation(M_PI, 1, 0, 0);
//平移
CATransform3DMakeTranslation(x,y,z)
//縮放
CATransform3DMakeScale(x,y,z);
//可以通過KVC的方式進(jìn)行設(shè)置屬性.
//但是CATransform3DMakeRotation的值是一個(gè)結(jié)構(gòu)體, 所以要把結(jié)構(gòu)轉(zhuǎn)成對(duì)象.
NSValue *value = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI, 1, 0, 0)];
[_imageView.layer setValue:value forKeyPath:@"transform.scale"];

什么時(shí)候用KVC?
當(dāng)需要做一些快速縮放,平移,二維的旋轉(zhuǎn)時(shí)用KVC.
比如: [_imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];快速的進(jìn)行縮放.

后面forKeyPath屬性值不是亂寫的.蘋果文檔當(dāng)中給了相關(guān)的屬性.

forKeyPath屬性值

2. 自定義CALayer.

2.1 如何自定義Layer.

自定義CALayer的方式創(chuàng)建UIView的方式非常相似.

CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(50, 50, 100, 100);
layer.backgroundColor = [UIColor redColor].CGColor;
[self.view.layer addSublayer:layer];
給layer設(shè)置圖片.
layer.contents = (id)[UIImage imageNamed:@"icon"].CGImage;

2.2 關(guān)于CALayer的疑惑?

為什么要使用CGImageRef、CGColorRef?

CALayer定義在QuartzCore框架中.
CGImageRef他爸、CGColorRef兩種數(shù)據(jù)類型定義在CoreGraphics框架中.
UIColor聂宾、UIImage定義在UIKit框架中.
QuartzCore框架和CoreGraphics框架是可以跨平臺(tái)使用的,在iOS和Mac OSX上都能使用.
但是UIKit框架只能在iOS中使用.
所以為了保證可移植性诊笤,QuartzCore不能使用UIImage系谐、UIColor,只能使用CGImageRef讨跟、CGColorRef.

UIView和CALayer都能夠顯示東西,該怎樣選擇?

對(duì)比CALayer纪他,UIView多了一個(gè)事件處理的功能。也就是說晾匠,CALayer不能處理用戶的觸摸事件茶袒,而UIView可以,但是CALayer的性能會(huì)高一些凉馆,因?yàn)樗倭耸录幚淼墓δ艿虞p量級(jí)
如果顯示出來的東西需要跟用戶進(jìn)行交互的話,用UIView句喜;
如果不需要跟用戶進(jìn)行交互预愤,用UIView或者CALayer都可以
我們平常開發(fā)中一般用UIView.

3. CALayer的兩個(gè)重要屬性position和anchorPoint

position和anchorPoint是CAlayer的兩個(gè)屬性.我們以前修改一個(gè)控件的位置都是能過Frame的方式進(jìn)行修改.現(xiàn)在利用CALayer的position和anchorPoint屬性也能夠修改控件的位置.

這兩個(gè)屬性是配合使用的.
position:它是用來設(shè)置當(dāng)前的layer在父控件當(dāng)中的位置的.所以它的坐標(biāo)原點(diǎn).以父控件的左上角為(0.0)點(diǎn).
anchorPoint:它是決點(diǎn)CALayer身上哪一個(gè)點(diǎn)會(huì)在position屬性所指的位置
anchorPoint是以當(dāng)前的layer左上角為原點(diǎn)(0.0),它的取值范圍是0~1,默認(rèn)位置在中間也就是(0.5,0.5).
anchorPoint又稱錨點(diǎn).就是把錨點(diǎn)定到position所指的位置.
兩者結(jié)合使用.想要修改某個(gè)控件的位置,我們可以設(shè)置它的position點(diǎn).
設(shè)置完畢后.layer身上的anchorPoint會(huì)自動(dòng)定到position所在的位置.

position和anchorpint圖示

4. 隱式動(dòng)畫.

4.1 什么是隱式動(dòng)畫?

了解什么是隱式動(dòng)畫前,要先了解什么是根層和非根層.
根層:UIView內(nèi)部自動(dòng)關(guān)聯(lián)著的那個(gè)layer我們稱它是根層.
非根層:自己手動(dòng)創(chuàng)建的層,稱為非根層.

隱式動(dòng)畫就是當(dāng)對(duì)非根層的部分屬性進(jìn)行修改時(shí), 它會(huì)自動(dòng)的產(chǎn)生一些動(dòng)畫的效果.我們稱這個(gè)默認(rèn)產(chǎn)生的動(dòng)畫為隱式動(dòng)畫.這些屬性稱為Animatable Properties(可動(dòng)畫屬性)。
也就是 手動(dòng)創(chuàng)建的CALayer對(duì)象咳胃,都存在著隱式動(dòng)畫

列舉常見的Animatable Properties:

  1. bounds:CALayer的寬度和高度植康,修改時(shí)產(chǎn)生縮放動(dòng)畫。
  2. backgroundColor:背景顏色展懈,修改時(shí)產(chǎn)生背景顏色漸變動(dòng)畫效果销睁。
  3. position:CALayer的位置供璧,修改時(shí)產(chǎn)生平移動(dòng)畫

例:

如何取消隱式動(dòng)畫?
首先要了解動(dòng)畫底層是怎么做的.動(dòng)畫的底層是包裝成一個(gè)事務(wù)來進(jìn)行的.
什么是事務(wù)?
很多操作綁定在一起,當(dāng)這些操作執(zhí)行完畢后,才去執(zhí)行下一個(gè)操作.

因此我們自己開啟事務(wù),并在事物中設(shè)置沒有動(dòng)畫就會(huì)隱藏動(dòng)畫了

//開啟事務(wù)
[CATransaction begin];
//設(shè)置事務(wù)沒有動(dòng)畫
[CATransaction setDisableActions:YES];
//設(shè)置動(dòng)畫執(zhí)行的時(shí)長(zhǎng)
[CATransaction setAnimationDuration:2];
//這其中修改屬性就沒有動(dòng)畫了

//提交事務(wù)
[CATransaction commit];

?本文借鑒了很多前輩的文章冻记,如果有不對(duì)的地方請(qǐng)指正睡毒,歡迎大家一起交流學(xué)習(xí) xx_cc 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冗栗,一起剝皮案震驚了整個(gè)濱河市演顾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隅居,老刑警劉巖钠至,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胎源,居然都是意外死亡棉钧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門涕蚤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪卿,“玉大人,你說我怎么就攤上這事万栅±⒉叮” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵申钩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我瘪阁,道長(zhǎng)撒遣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任管跺,我火速辦了婚禮义黎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豁跑。我一直安慰自己廉涕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布艇拍。 她就那樣靜靜地躺著狐蜕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卸夕。 梳的紋絲不亂的頭發(fā)上层释,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音快集,去河邊找鬼贡羔。 笑死廉白,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乖寒。 我是一名探鬼主播猴蹂,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼楣嘁!你這毒婦竟也來了磅轻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤马澈,失蹤者是張志新(化名)和其女友劉穎瓢省,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痊班,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勤婚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涤伐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馒胆。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凝果,靈堂內(nèi)的尸體忽然破棺而出祝迂,到底是詐尸還是另有隱情,我是刑警寧澤器净,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布型雳,位于F島的核電站,受9級(jí)特大地震影響山害,放射性物質(zhì)發(fā)生泄漏纠俭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一浪慌、第九天 我趴在偏房一處隱蔽的房頂上張望冤荆。 院中可真熱鬧,春花似錦权纤、人聲如沸钓简。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽外邓。三九已至,卻和暖如春古掏,著一層夾襖步出監(jiān)牢的瞬間坐榆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工冗茸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留席镀,地道東北人匹中。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像豪诲,于是被迫代替她去往敵國(guó)和親顶捷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • CALayer的基本操作. CALayer簡(jiǎn)介:CALayer我們又稱為層屎篱,在每個(gè)UIView內(nèi)部都有一個(gè)laye...
    _山人自有妙計(jì)閱讀 1,466評(píng)論 0 0
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果服赎,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌交播。在這里你可以看...
    每天刷兩次牙閱讀 8,465評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果重虑,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫全貌秦士。在這里你可以看...
    F麥子閱讀 5,094評(píng)論 5 13
  • 在iOS實(shí)際開發(fā)中常用的動(dòng)畫無非是以下四種:UIView動(dòng)畫缺厉,核心動(dòng)畫,幀動(dòng)畫隧土,自定義轉(zhuǎn)場(chǎng)動(dòng)畫提针。 1.UIView...
    請(qǐng)叫我周小帥閱讀 3,078評(píng)論 1 23
  • Core Animation Core Animation,中文翻譯為核心動(dòng)畫曹傀,它是一組非常強(qiáng)大的動(dòng)畫處理API辐脖,...
    45b645c5912e閱讀 3,015評(píng)論 0 21