? ? ? 在iOS中所謂的核心動畫在表面上理解是視圖的在二維或三維空間上位置,大小,角度等方面的變化, 在視覺效果上給用戶一種賞心悅目的感覺, 在介紹核心動畫之前我們先了解一下圖層和視圖的關系.
視圖和圖層
一個視圖就是在屏幕上顯示的一個矩形塊(圖片,視頻等),他能夠攔截類似于觸摸手勢等用戶的輸入,視圖在層級關系中可以相互嵌套,其中一個視圖可以管理它的所有位置.
CALayer
CALayer類和UIView很形似,在CALayer上也可以添加(圖片,視頻等).其中UIView和CALayer最大的區別CALayer不處理用戶的交互.UIView和CALayer是一種相互平行的關系.
例如:當你在CALayer上添加一個image(圖片時)你會發現與你之前在UIView上添加的圖片,兩者在位置上會有差距, ?在Xcode中你可以觀察一下圖層視圖, 如果在CALayer下添加圖片其圖片的位置會與圖層在同一界面, 如果你在UIView上面添加圖片會發現圖片并不會與view在同一視圖層,示例如下
那么既然UIView上面能放圖片,視頻.那么為什么開發者還要生成CALayer這個類呢,CALayer類有很多輔助的功能:
(1). 陰影, 圓角, 帶顏色的邊框
(2). 3D變化
(3). 非矩形范圍
(4). 透明遮罩
(5). 多級非線性動畫
在CALayer中有很多屬性可以改變圖片的動畫,其屬性有:
CGRect bounds
CGPoint position ?用來設置CALayer在父層中的位置
以父層的左上角為原點(0, 0, 0)三維 或 (0, 0)二維
CGFloat zPosition 用來設置CALayer在父層中的位置
以父層的左上角為原點(0)
CGPoint anchorPoint ?稱為“定位點”、“錨點”
決定著CALayer身上的哪個點會在position屬性所指的位置
以自己的左上角為原點(0, 0)
它的x、y取值范圍都是0~1,默認值為(0.5, 0.5)
CGFloat anchorPointZ 在3D中在Z中的錨點
BOOL hidden 是否隱藏視圖
BOOL masksToBounds 是否切割該視圖上面的余下的部分 通常與cornerRadius搭配使用
這么多的屬性,一一進行嘗試,就會發現其中神奇之處,一些效果在View層面是做不出來的.下面我將介紹幾個重要的屬性
屬性:contents
CALayer 有一個屬性叫做contents,這個屬性的類型被定義為id,意味著它可以是任何類型的對象。在這種情況下,你可以給contents屬性賦任何值。但是,在實踐中,如果你給contents賦的不是CGImage,那么你得到的圖層將是空白的。
它之所以被定義為id類型,是因為在Mac OS系統上,這個屬性對CGImage和NSImage類型的值都起作用。如果你試圖在iOS平臺上將UIImage的值賦給它,只能得到一個空白的圖層。
事實上,你真正要賦值的類型應該是CGImageRef,它是一個指向CGImage結構的指針。UIImage有一個CGImage屬性,它返回一個"CGImageRef",如果你想把這個值直接賦值給CALayer的contents,那你將會得到一個編譯錯誤。
盡管Core Foundation類型跟Cocoa對象在運行時貌似很像(被稱作toll-free bridging),它們并不是類型兼容的,不過你可以通過bridged關鍵字轉換。如果要給圖層的寄宿圖賦值,你可以按照以下這個方法:
如果你沒有使用ARC,你就不需要__bridge這部分。
讓我們來繼續修改我們在第一章新建的工程,以便能夠展示一張圖片而不僅僅是一個背景色。我們已經用代碼的方式建立一個圖層,那我們就不需要額外的圖層了。那么我們就直接把layerView的宿主圖層的contents屬性設置成圖片。
清單2.1 更新后的代碼。