目錄
- 什么是Core Animation
- 視圖與圖層關(guān)系
- 添加圖層到視圖關(guān)聯(lián)的圖層下(實(shí)踐)
- 寄宿圖
什么是Core Animation
Core Animation是一個(gè)復(fù)合引擎云茸,它的職責(zé)就是盡可能快的組合屏幕上不同的可視內(nèi)容刻像,這個(gè)內(nèi)容是被分解成獨(dú)立的圖層叉寂,存儲(chǔ)在一個(gè)叫圖層樹(shù)的體系之中。
視圖與圖層關(guān)系
-
什么是視圖 UIView
Paste_Image.png
視圖之間有層級(jí)關(guān)系,一個(gè)視圖就是屏幕上顯示的一個(gè)矩形塊曹锨,能夠攔截類(lèi)似于鼠標(biāo)點(diǎn)擊或者觸摸手勢(shì)等用戶輸入舵盈。視圖能夠互相嵌套,一個(gè)視圖管理它的所以子視圖的顯示(位置驮宴,尺寸)逮刨。
視圖的能力
1.可以處理觸摸事件 2.支持基于Core Graphics繪制 3.放射變化(旋轉(zhuǎn)或縮放) 4. 做簡(jiǎn)單的動(dòng)畫(huà)什么是圖層 CALayer
跟視圖類(lèi)似,同樣也是被層級(jí)關(guān)系樹(shù)管理的矩形塊堵泽,管理子圖層的顯示(位置及尺寸)修己。與視圖不同的是不處理用戶的交互,但能知道一個(gè)觸點(diǎn)是否落在圖層范圍內(nèi)迎罗。圖層的能力
圖層雖然不能像視圖那樣處理觸摸事件睬愤,但它有許多UIView無(wú)能為力的功能:
1.陰影,圓角纹安,帶顏色的邊框
2.3D變換
3.非矩陣范圍
4.透明遮罩
5.多級(jí)非線性動(dòng)畫(huà)兩者關(guān)系
每個(gè)UIView都有一個(gè)CALayer實(shí)例的圖層屬性尤辱,視圖職責(zé)就是創(chuàng)建并管理這個(gè)圖層。實(shí)際上這些背后關(guān)聯(lián)的圖層才是真正用來(lái)在屏幕上顯示和做動(dòng)畫(huà)厢岂,UIView僅僅是對(duì)它的一個(gè)封裝光督。除了視圖層級(jí)、圖層層級(jí)之外還存在呈現(xiàn)書(shū)和渲染樹(shù)
添加圖層到視圖關(guān)聯(lián)的圖層下
- (void)viewDidLoad {
[super viewDidLoad];
//新建View
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 200)];
[self.view addSubview:myView];
//修改視圖顏色
myView.backgroundColor = [UIColor redColor];
//添加一個(gè)圖層到視圖的圖層上
CALayer *blackLayer = [CALayer layer];
blackLayer.frame = CGRectMake(20, 20, 100, 100);
blackLayer.backgroundColor = [UIColor blackColor].CGColor;
[myView.layer addSublayer:blackLayer];
}```

一個(gè)視圖只有一個(gè)相關(guān)的圖層(自動(dòng)創(chuàng)建)塔粒,就像上面的例子中當(dāng)myView實(shí)例創(chuàng)建后它所關(guān)聯(lián)唯一圖層也自動(dòng)創(chuàng)建好了结借。使用圖層所關(guān)聯(lián)的視圖而不是CALyer的好處在于,你能使用所有CALayer底層特性的同時(shí)卒茬,也可以使用UIView的高級(jí)API(比如自動(dòng)排版船老,布局和事件處理)。
當(dāng)如果有滿足以下條件圃酵,可以考慮使用CALyer而不是UIView:
* 開(kāi)發(fā)同時(shí)在Mac OS上運(yùn)行跨平臺(tái)應(yīng)用
* 使用多種CALayer的子類(lèi)
* 做一些對(duì)性能有著很苛刻的要求
### 寄宿圖
* contents屬性
CALayer有個(gè)contents屬性柳畔,雖然是id類(lèi)型,但如果不是賦值CGImage的話圖層將是空白的郭赐。UIImage有一個(gè)CGImage屬性荸镊,所以可以這樣賦值`layer.contents = (__bridge id)image.CGImage;`
給視圖所關(guān)聯(lián)圖層添加寄宿圖
UIImage *image = [UIImage imageNamed:@"Snowman.png"];
self.layerView.contents = (__bridge id)image.CGImage;

利用CALayer在一個(gè)普通的UIView中顯示一張圖片
* contentGravity
CALayer中contentGravity屬性類(lèi)似view中contentMode屬性,其實(shí)對(duì)UIView.contentMode操作就是對(duì)關(guān)聯(lián)圖層contentGravity屬性的操作。
contentsGravity可選常量值有以下:
kCAGravityCenter
kCAGravityTop
kCAGravityBottom
kCAGravityLeft
kCAGravityRight
kCAGravityTopLeft
kCAGravityTopRight
kCAGravityBottomLeft
kCAGravityBottomRight
kCAGravityResize
kCAGravityResizeAspect
kCAGravityResizeAspectFill```
和cotentMode一樣躬存,contentsGravity決定內(nèi)容在圖層的邊界怎么對(duì)齊张惹。self.layerView.layer.contentsGravity = kCAGravityResizeAspect;
contentsScale
contentsScale屬性定義了寄宿圖的像素尺寸和視圖大小的比例,默認(rèn)情況下它的值為1.0的浮點(diǎn)數(shù)岭洲。
注意:本人對(duì)這個(gè)這個(gè)屬性了解不多宛逗,如果寄宿圖顯示偏大或其他錯(cuò)誤可以試試這樣設(shè)置contentsScale屬性:layer.contentsScale = [UIScreen mainScreen].scale;
maskToBounds
如果視圖的子視圖或者相關(guān)聯(lián)圖層的子圖層超出了視圖的邊界。默認(rèn)情況下UIView仍然會(huì)繪制超過(guò)邊界的內(nèi)容或者子視圖
UIView有個(gè)clipsToBounds的屬性用來(lái)覺(jué)得是否顯示超出邊界的內(nèi)容盾剩,CALayer對(duì)應(yīng)的屬性是masksToBounds雷激。設(shè)置
self.myView.clipsToBounds = YES
或者self.myView.layer.masksToBounds = YES
兩個(gè)表達(dá)式等效
-
contentsRect
CALayer的contentsRect屬性允許我們顯示一部分的寄宿圖到圖層中,被裁減的寄宿圖被拉伸到適應(yīng)圖層大小告私。
默認(rèn)的contentsRect是{0屎暇,0,1驻粟,1}
當(dāng)設(shè)置contentsRect = {0.5根悼,0.5}
時(shí)顯示如下第二張圖
Paste_Image.png contentsCenter
contentsCenters是個(gè)CGRect,它定義了一個(gè)固定的邊框和一個(gè)在圖層上可拉伸的區(qū)域蜀撑,一般和contentsRect屬性配合使用挤巡,了解contentsRect跟contentsCenter屬性可以看看這篇博客圖文并茂,清晰明了酷麦。