1. 程式人生 > >iOS UIView 和 CALayer 的關係

iOS UIView 和 CALayer 的關係

一、概念:
UIView不具備顯示功能,擁有顯示功能的是它內部的圖層即CALayer屬性

當UIView需要顯示到螢幕上時,會呼叫DrawRect:方法進行繪圖,並且將所有的內容繪製在自己的圖層上Property()CALayer *layer,繪圖完成後,系統會將圖層拷貝到螢幕上,於是就完成了UIView的顯示

UIView 的Layer屬性在系統內部,被維護著三份拷貝。分別是邏輯樹,這裡是程式碼可以操作的;動畫樹,是一箇中間層,系統就在這一層上更改屬性,進行各種渲染操作;顯示樹,其內容就是當前正被顯示在螢幕上的內容

UIView 本身更像是一個CALayer的管理器,UIView 有個屬性CALayer *layer ,所有從UIView繼承的物件都繼承了該屬性。因此,可以通過layer 屬性對view 進行 轉換、縮放、旋轉等操作
二、簡單使用:

1.通過CALayer設定邊框的顏色、寬度、圓角
self.view.layer.borderWidth = 20;
self.view.layer.borderColor = [UIColor greenColor].CGColor;
self.view.layer.cornerRadius = 20;

2.在layer 上新增一張圖片
self.view.layer.contents = (id)[UIImage imageNamed:@""].CGImage
//contents是id型別,可以接受內容,上面的例項讓layer顯示一張圖片,仔細觀察可以發現四個圓角的部分露了一個角出來。
設定Image不是展示在主圖層上的,而是顯示子圖層上的。可以通過設定一個範圍,設定超出主圖層的部分把它切掉
self.view.layer.masksToBounds = YES;
或self.view.clipsToBounds = YES;

3. 動畫的運作:對UIView的subLayer(非主Layer)屬性進行更改,系統將自動進行動畫生成,動畫持續時間的預設值似乎是0.5秒。
4. 座標系統:CALayer的座標系統比UIView多了一個anchorPoint屬性,使用CGPoint結構表示,值域是0~1,是個比例值。這個點是各種圖形變換的座標原點,同時會更改layer的position的位置,它的預設值是{0.5,0.5},即在layer的中央。
 某layer.anchorPoint = CGPointMake(0.f,0.f);
 5.渲染:當更新層,改變不能立即顯示在螢幕上。當所有的層都準備好時,可以呼叫setNeedsDisplay方法來重繪顯示。 [gameLayer setNeedsDisplay];
  若要重繪部分螢幕區域,請使用setNeedsDisplayInRect:方法,通過在CGRect結構的區域更新: [gameLayer
  setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)]; 如果是用的CoreGraphics框架來執行渲染的話,可以直接渲染Core Graphics的內容。用renderInContext:來做這個事。 [gameLayer renderInContext:UIGraphicsGetCurrentContext()];
  6.變換:要在一個層中新增一個3D或仿射變換,可以分別設定層的transform或affineTransform屬性。 characterView.layer.transform =CATransform3DMakeScale(-1.0,-1.0,1.0);
  CGAffineTransform transform =CGAffineTransformMakeRotation(45.0);
  backgroundView.layer.affineTransform = transform;
  7.變形:Quartz Core的渲染能力,使二維影象可以被自由操縱,就好像是三維的。影象可以在一個三維座標系中以任意角度被旋轉,縮放和傾斜。CATransform3D的一套方法提供了一些魔術般的變換效果。