? ? ? 在iOS中所謂的核心動(dòng)畫在表面上理解是視圖的在二維或三維空間上位置,大小,角度等方面的變化, 在視覺效果上給用戶一種賞心悅目的感覺, 在介紹核心動(dòng)畫之前我們先了解一下圖層和視圖的關(guān)系.
視圖和圖層
一個(gè)視圖就是在屏幕上顯示的一個(gè)矩形塊(圖片,視頻等),他能夠攔截類似于觸摸手勢等用戶的輸入,視圖在層級(jí)關(guān)系中可以相互嵌套,其中一個(gè)視圖可以管理它的所有位置.
CALayer
CALayer類和UIView很形似,在CALayer上也可以添加(圖片,視頻等).其中UIView和CALayer最大的區(qū)別CALayer不處理用戶的交互.UIView和CALayer是一種相互平行的關(guān)系.
例如:當(dāng)你在CALayer上添加一個(gè)image(圖片時(shí))你會(huì)發(fā)現(xiàn)與你之前在UIView上添加的圖片,兩者在位置上會(huì)有差距, ?在Xcode中你可以觀察一下圖層視圖, 如果在CALayer下添加圖片其圖片的位置會(huì)與圖層在同一界面, 如果你在UIView上面添加圖片會(huì)發(fā)現(xiàn)圖片并不會(huì)與view在同一視圖層,示例如下
那么既然UIView上面能放圖片,視頻.那么為什么開發(fā)者還要生成CALayer這個(gè)類呢,CALayer類有很多輔助的功能:
(1). 陰影, 圓角, 帶顏色的邊框
(2). 3D變化
(3). 非矩形范圍
(4). 透明遮罩
(5). 多級(jí)非線性動(dòng)畫
在CALayer中有很多屬性可以改變圖片的動(dòng)畫,其屬性有:
CGRect bounds
CGPoint position ?用來設(shè)置CALayer在父層中的位置
以父層的左上角為原點(diǎn)(0, 0, 0)三維 或 (0, 0)二維
CGFloat zPosition 用來設(shè)置CALayer在父層中的位置
以父層的左上角為原點(diǎn)(0)
CGPoint anchorPoint ?稱為“定位點(diǎn)”悠鞍、“錨點(diǎn)”
決定著CALayer身上的哪個(gè)點(diǎn)會(huì)在position屬性所指的位置
以自己的左上角為原點(diǎn)(0, 0)
它的x脚线、y取值范圍都是0~1刀脏,默認(rèn)值為(0.5, 0.5)
CGFloat anchorPointZ 在3D中在Z中的錨點(diǎn)
BOOL hidden 是否隱藏視圖
BOOL masksToBounds 是否切割該視圖上面的余下的部分 通常與cornerRadius搭配使用
這么多的屬性,一一進(jìn)行嘗試,就會(huì)發(fā)現(xiàn)其中神奇之處,一些效果在View層面是做不出來的.下面我將介紹幾個(gè)重要的屬性
屬性:contents
CALayer 有一個(gè)屬性叫做contents帅韧,這個(gè)屬性的類型被定義為id察皇,意味著它可以是任何類型的對(duì)象。在這種情況下像寒,你可以給contents屬性賦任何值丁鹉。但是,在實(shí)踐中召锈,如果你給contents賦的不是CGImage旁振,那么你得到的圖層將是空白的。
它之所以被定義為id類型,是因?yàn)樵贛ac OS系統(tǒng)上规求,這個(gè)屬性對(duì)CGImage和NSImage類型的值都起作用筐付。如果你試圖在iOS平臺(tái)上將UIImage的值賦給它卵惦,只能得到一個(gè)空白的圖層阻肿。
事實(shí)上,你真正要賦值的類型應(yīng)該是CGImageRef沮尿,它是一個(gè)指向CGImage結(jié)構(gòu)的指針丛塌。UIImage有一個(gè)CGImage屬性,它返回一個(gè)"CGImageRef",如果你想把這個(gè)值直接賦值給CALayer的contents畜疾,那你將會(huì)得到一個(gè)編譯錯(cuò)誤赴邻。
盡管Core Foundation類型跟Cocoa對(duì)象在運(yùn)行時(shí)貌似很像(被稱作toll-free bridging),它們并不是類型兼容的啡捶,不過你可以通過bridged關(guān)鍵字轉(zhuǎn)換姥敛。如果要給圖層的寄宿圖賦值,你可以按照以下這個(gè)方法:
如果你沒有使用ARC瞎暑,你就不需要__bridge這部分彤敛。
讓我們來繼續(xù)修改我們?cè)诘谝徽滦陆ǖ墓こ蹋员隳軌蛘故疽粡垐D片而不僅僅是一個(gè)背景色了赌。我們已經(jīng)用代碼的方式建立一個(gè)圖層墨榄,那我們就不需要額外的圖層了。那么我們就直接把layerView的宿主圖層的contents屬性設(shè)置成圖片勿她。
清單2.1 更新后的代碼袄秩。