1.CALayer
在iOS中,你能看得見摸得着的東西基本上都是UIView,比如一個按鈕、一個文本標籤、一個文本輸入框、一個圖標等等,這些都是UIView
其實UIView之所以能顯示在屏幕上,完全是因爲它內部的一個圖層
在創建UIView對象時,UIView內部會自動創建一個圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個層
@property(nonatomic,readonly,retain)CALayer *layer;
當UIView需要顯示到屏幕上時,會調用drawRect:方法進行繪圖,並且會將所有內容繪製在自己的圖層上,繪圖完畢後,系統會將圖層拷貝到屏幕上,於是就完成了UIView的顯示
換句話說,UIView本身不具備顯示的功能,是它內部的層纔有顯示功能
2.CALayer的基本使用
通過操作CALayer對象,可以很方便地調整UIView的一些外觀屬性,比如:
陰影
圓角大小
邊框寬度和顏色
… …
還可以給圖層添加動畫,來實現一些比較炫酷的效果
3.CALayer的屬性
寬度和高度
@property CGRect bounds;
位置(默認指中點,具體由anchorPoint決定)
@property CGPoint position;
錨點(x,y的範圍都是0-1),決定了position的含義
@property CGPoint anchorPoint;
背景顏色(CGColorRef類型)
@property CGColorRefbackgroundColor;
形變屬性
@property CATransform3Dtransform;
邊框顏色(CGColorRef類型)
@property CGColorRefborderColor;
邊框寬度
@property CGFloat borderWidth;
圓角半徑
@property CGColorRefborderColor;
內容(比如設置爲圖片CGImageRef)
@property(retain) id contents;
4.關於CALayer的疑惑
首先
CALayer是定義在QuartzCore框架中的
CGImageRef、CGColorRef兩種數據類型是定義在CoreGraphics框架中的
UIColor、UIImage是定義在UIKit框架中的
其次
QuartzCore框架和CoreGraphics框架是可以跨平臺使用的,在iOS和Mac OS X上都能使用
但是UIKit只能在iOS中使用
爲了保證可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef
5.UIView和CALayer的選擇
通過CALayer,就能做出跟UIImageView一樣的界面效果
既然CALayer和UIView都能實現相同的顯示效果,那究竟該選擇誰好呢?
其實,對比CALayer,UIView多了一個事件處理的功能。也就是說,CALayer不能處理用戶的觸摸事件,而UIView可以
所以,如果顯示出來的東西需要跟用戶進行交互的話,用UIView;如果不需要跟用戶進行交互,用UIView或者CALayer都可以
當然,CALayer的性能會高一些,因爲它少了事件處理的功能,更加輕量級
6.position和anchorPoint
CALayer有2個非常重要的屬性:position和anchorPoint
@property CGPoint position;
用來設置CALayer在父層中的位置
以父層的左上角爲原點(0, 0)
@property CGPoint anchorPoint;
稱爲“定位點”、“錨點”
決定着CALayer身上的哪個點會在position屬性所指的位置
以自己的左上角爲原點(0, 0)
它的x、y取值範圍都是0~1,默認值爲(0.5, 0.5)
7.隱式動畫
每一個UIView內部都默認關聯着一個CALayer,我們可用稱這個Layer爲Root Layer(根層)
所有的非RootLayer,也就是手動創建的CALayer對象,都存在着隱式動畫
什麼是隱式動畫?
當對非RootLayer的部分屬性進行修改時,默認會自動產生一些動畫效果
而這些屬性稱爲Animatable Properties(可動畫屬性)
列舉幾個常見的Animatable Properties:
bounds:用於設置CALayer的寬度和高度。修改這個屬性會產生縮放動畫
backgroundColor:用於設置CALayer的背景色。修改這個屬性會產生背景色的漸變動畫
position:用於設置CALayer的位置。修改這個屬性會產生平移動畫
可以通過動畫事務(CATransaction)關閉默認的隱式動畫效果
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position= CGPointMake(10,10);
[CATransaction commit];