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)的屬性.
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所在的位置.
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:
- bounds:CALayer的寬度和高度植康,修改時(shí)產(chǎn)生縮放動(dòng)畫。
- backgroundColor:背景顏色展懈,修改時(shí)產(chǎn)生背景顏色漸變動(dòng)畫效果销睁。
- 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 。