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的一套方法提供了一些魔術般的變換效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章