l1>CALayer中的“可動畫屬性”.
a)凡是文檔中有“animatable”字樣的屬性都是“可動畫屬性”.
b)可動畫屬性就是說:只要設置了屬性(改變了屬性),會自動使用動畫的方式來執行.
CALayer主要用來展示動畫的, layer不具備交互功能.
Layer中有一個addAnimation:forKey:來為layer添加屬性動畫.
label.layer addAnimation:<#(nonnullCAAnimation*)#>forKey:<#(nullableNSString*)#>
l2>通過CALayer的transform屬性可以實現“旋轉” “平移” “縮放”效果.
structCATransform3D
{
CGFloat m11, m12, m13, m14;
CGFloat m21, m22, m23, m24;
CGFloat m31, m32, m33, m34;
CGFloat m41, m42, m43, m44;
};
structCGAffineTransform{
CGFloat a, b, c, d;
CGFloat tx, ty;
};
設置背景圖片的三種方式:
l1>設置layer的contents屬性
l2>調用自定義view的drawRect:方法進行繪制
l3>設置view的backgroundColor,調用colorWithPatternImage來進行設置.
CALayer的總結
l1>CA -> Core Animation (核心動畫)相對更底層. CALayer負責視圖中顯示內容和動畫.所有動畫都是作用在CALayer上的. UIView負責監聽和相應事件.UIView是更高層的封裝
l2>在iOS中,你能看得見,摸得著的東西基本上都是UIView.比如一個按鈕,一個文本標簽,一個文本輸入框,一個圖標等.這些都是UIView,其實UIView之所以能顯示在屏幕上,完全是因為它內部的一個圖層,在創建UIView對象時, UIView內部會自動創建一個圖層(即CALayer對象),通過UIView的layer屬性即可訪問這個圖層.當UIView需要顯示到屏幕上時,會調用drawRect:方法進行繪圖,并且會將所有內容繪制在自己的圖層上,繪圖完畢后,系統會將圖層拷貝到屏幕上,于是就完成了UIView得顯示.換句話說,UIView本身不具備顯示的功能,是它內部的層才有顯示功能.
l3>首先: CALayer是定義在QuartzCore框架中. CGImageRef, CGColorRef兩種數據類型是定義在CoreGraphics框架中的. UIColor, UIImage是定義在UIKit框架中的.其次: QuartzCore框架和CoreGraphics框架是可以跨平臺使用的,在iOS和Mac OS X上都能使用(C語言編寫)但是UIKit只能在iOS中使用(OC編寫).因此:為了保證可移植性,QuartzCore不能使用UIImage,UIColor,只能使用CGImageRef,CGColorRef.
l4>隱式動畫(可動畫屬性)什么是隱式動畫?當對非Root Layer的部分屬性進行修改時,默認會自動產生一些動畫效果,而這些屬性稱為Animatable Properties (可動畫屬性).如: bounds :用于設置CALayer的寬度和高度,修改這個屬性會產生縮放動畫. background :用戶設置CALayer的背景色,修改這個屬性會產生背景色的漸變動畫. position :用于設置CALayer的位置,修改這個屬性會產生平移動畫.
l5>可以通過動畫事務(CATransaction)關閉默認的隱式動畫效果.代碼參考如下:
[CATransaction begin];
[CATransactionsetDisableActions:YES];
your code…
[CATransactioncommit];
l6>
UIView和CALayer的選擇.通過CALayer就能做出根UIView一樣的界面效果.都能實現相同的顯示效果,請問:那究竟該選擇誰好呢?其實,對比CALayer,UIView多了一個事件處理的功能,也就是說,CALayer不能處理用戶的觸摸事件,而UIView可以.所以,如果顯示出來的東西需要跟用戶進行交互的話,用UIView.UIView用來接收和處理系統事件,觸摸事件.如果不需要跟用戶進行交互,用UIView或者CALayer都可以.當然,CALayer的性能會高一些,因為它少了事件處理的功能,更加輕量級.