核心動畫程式設計(一)

Crazy巴旦木發表於2018-08-08

所有知識點來自《核心動畫程式設計指南》知識點 一.動畫介紹 核心動畫類分為:圖層類,動畫和計時類,佈局和約束類,事務類(組合圖層類)。

1)圖層類

2)動畫和計時類

繼承於CAAnimation,實現了CAMediaTiming協議,提供了持續時間,速度和重複計數。

也實現了CAAction協議,為圖層觸發動畫提供了標準化響應。

額外的抽象細化的動畫類:

CATransition過渡效果。

CAAnimationGroup組合動畫。

CAPropertyAnimation支援動畫顯示圖層的關鍵路徑中指定的屬性。

CABasicAnimation修改圖層屬性。

CAKeyframeAnimation 關鍵幀動畫

3)佈局和約束類

CAConstraint指定子圖層類限制於你指定的約束集合。

4)事務類

CATransaction負責協調多個原子動畫更新顯示操作。

三.圖層的幾何和變換 座標系 在iOS系統中,預設的座標系統原點在圖層的左上角方向,向右和向下為正值。

幾何 圖層的position是一個CGPoint值,指定的相當於它在父檢視的位置,該值基於父圖層的座標系。

圖層的bounds屬性是一個CGRect值,指定圖層的大小和圖層的原點。當你重寫圖層的重畫方法時,bounds原點可以作為圖形上下文的原點。

bounds.size = frame.size.

錨點anchorPoint是一個CGPoint值,指定了基於圖層bounds的符合位置的座標系的位置。錨點指定了bounds相對於position的值。錨點(0.0,0.0)是圖層的原點。

幾何變換 CATransform3D定義了一個同質的三維變換,用於圖層的旋轉,縮放,偏移,歪斜和應用的透視。

transform和sublayerTransform屬性指定了變換矩陣。transform指定的矩陣結合圖層的anchorPoint作用於圖層和圖層的子圖層上面。sublayerTransform只會影響圖層的子圖層,不會對圖層本身產生影響。

可以通過幾個方法改變CATransform3D的資料結構:使用CATransform3D函式,直接修改資料結構的成員,使用鍵值編碼改變鍵路徑。

變換函式 CATransform3DMakeTranslation,CATransform3DTranslate,CATransform3DMakeScale,CATransform3DMakeRotation,CATransform3DRotate。

旋轉的單位採用的是弧度(radians),而不是角度,可以互相切換。DegreesToRadians和RadiansToDegress。

反向轉換矩陣CATransform3DInvert。用反轉點內轉化物件提供反向轉換。反轉矩陣乘以逆矩陣值,結果是原值,可以用來回復已經被變換了的矩陣。

方法:CATransform3DMakeAffineTransform,CATransform3DIsAffine,CATransform3DGetAffineTransform。

同時有方法來比較變換矩陣是否是單位矩陣,或者兩個矩陣是否相等:CATranform3DIsIdentity,CATranform3DEqualToTransform.

修改變換的資料結構 struct CATransform3D

{

CGFloat m11, m12, m13, m14;

CGFloat m21, m22, m23, m24;

CGFloat m31, m32, m33, m34;

};

typedef struct CATransform3D CATransform3D;

配置

CATransform3D aTransform = CATransform3DIdentity;

// the value of zDistance affects the sharpness of the transform.

zDistance = 850;

aTransform.m34 = 1.0/-zDistance;

通過鍵值路徑修改變換 不能用常規的myLayer.transform.rotation.x = 0;

需要通過setValue:forKeyPath:或者valueForKeyPath:方法:

[myLayer setValue:【NSNumber numberWithInt:0】 forKeyPath:@"transform.rotation.x"];

四.圖層樹的層次結構 什麼是圖層結構 擁有父圖層suplayer和子圖層sublayer。圖層樹好處:

1.複雜的介面可以由簡單的圖層來組合。圖層非常適合於這種堆疊方式來合成複雜的功能。

2.每個圖層定義了一個基於其父圖層的座標系的座標系。當一個圖層變換的時候,它的子圖層同樣變換。

3.一個動態的圖層樹,可以再程式執行的時候重新設定。圖層可以建立並新增為一個圖層的第一個子圖層,然後從其他圖層的圖層樹上面刪除。

在檢視裡面顯示圖層 核心動畫通過檢視來顯示圖層。iOS的檢視系統是在圖層上的,每個UIView都自動建立一個CALayer類的例項,然後把該例項賦值給layer屬性。可以在需要的時候向檢視的圖層裡面新增子圖層。

從圖層結構裡面新增和刪除圖層 addSublayer:,insertSublayer:atIndex:,insertSublayer:below:,insertSublayer:above:,removeFormSuperlayer,replaceSublayer:with:。

可以通過使用一個圖層的陣列來設定圖層的子圖層,甚至可以擴充套件設定父圖層的sublayers屬性。當把圖層的sublayers屬性設定了一個圖層的陣列值的時候,你必須保證陣列裡面每個圖層的父圖層已經被設定為 nil。

圖層的位置調整和大小改變 frame、bounds、position、anchorPoint和zPosition來程式設計式移動和改變圖層大小。 如果一個圖層的屬性needsDisplayOnBoundsChange被設定為 YES 的時候,當圖層的bounds屬性改變的時候,圖層的內容將會被重新快取起來。預設情況下圖層的needsDisplayOnBoundsChange屬性值為 NO。

自動調整圖層大小 CALayer供了一個機制,在父圖層被移動或者改變大小的時候,子圖層可以自動的跟著移動和調整大小。在很多情況下簡單的配置一個圖層的自動調整掩碼(autoresizing mask)可以適當的適應程式的行為。一個圖層的自動調整掩碼可以通過指定CAAutoresizingMask的常量結合或運算(OR)所得的結果賦值給圖層的autoresizingMask屬性值。

CALayer的 子 類 可 以 重 寫 函 數resizeSublayersWithOldSize: 和resizeWithOldSuperlayerSize:來定製化的自動調整圖層大小的行為。圖層的函式resizeSublayersWithOldSize:將會在bounds屬性被修改的時候自動的觸發執行,同時傳送一個訊息resizeWithOldSuperlayerSize:給圖層的每個子圖層。圖層的每個子圖層根據自動調整掩碼的屬性來比較就的邊界值和新的邊界值來調整它的位置和大小。

裁剪子圖層 當子檢視超出父檢視的邊界的時候,檢視將會被裁剪以適應父檢視的大小。圖層去掉了這個限制,允許子層全部顯示,無論自己相對於父層位置如何。圖層的masksToBounds屬性決定了是否子圖層是否相對父圖層裁剪。該屬性masksToBounds的預設值為 NO,即防止子圖層被相對於父圖層裁剪。

相關文章