天天看點

OC筆記 - CALayer(2015.4.5)

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

繼續閱讀