iOS核心動畫解析1

weixin_34185560發表於2016-07-17

      在iOS中所謂的核心動畫在表面上理解是檢視的在二維或三維空間上位置,大小,角度等方面的變化, 在視覺效果上給使用者一種賞心悅目的感覺, 在介紹核心動畫之前我們先了解一下圖層和檢視的關係.

檢視和圖層

一個檢視就是在螢幕上顯示的一個矩形塊(圖片,視訊等),他能夠攔截類似於觸控手勢等使用者的輸入,檢視在層級關係中可以相互巢狀,其中一個檢視可以管理它的所有位置.

CALayer

CALayer類和UIView很形似,在CALayer上也可以新增(圖片,視訊等).其中UIView和CALayer最大的區別CALayer不處理使用者的互動.UIView和CALayer是一種相互平行的關係.

例如:當你在CALayer上新增一個image(圖片時)你會發現與你之前在UIView上新增的圖片,兩者在位置上會有差距,  在Xcode中你可以觀察一下圖層檢視, 如果在CALayer下新增圖片其圖片的位置會與圖層在同一介面, 如果你在UIView上面新增圖片會發現圖片並不會與view在同一檢視層,示例如下

2486875-30e438126ac9a6b3.png

那麼既然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關鍵字轉換。如果要給圖層的寄宿圖賦值,你可以按照以下這個方法:

2486875-fefb932c1e09b16b.png

如果你沒有使用ARC,你就不需要__bridge這部分。

讓我們來繼續修改我們在第一章新建的工程,以便能夠展示一張圖片而不僅僅是一個背景色。我們已經用程式碼的方式建立一個圖層,那我們就不需要額外的圖層了。那麼我們就直接把layerView的宿主圖層的contents屬性設定成圖片。

清單2.1 更新後的程式碼。

2486875-0a2702b8acc69960.png


相關文章