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];