CALayer屬于Core Animation部分的內(nèi)容,比較重要而不太好理解。以下是園子中看到的一篇文章的摘錄:
以下摘自<<核心動(dòng)畫編程指南>>:
兩者最大的區(qū)別是,圖層不會(huì)直接渲染到屏幕上。
在模型-視圖-控制器(model-view-controller)概念里面NSView和UIView是典型的視圖部分,但是在核心動(dòng)畫里面圖層是模型部分。圖層封裝了幾何、時(shí)間、可視化屬性,同時(shí)它提供了圖層現(xiàn)實(shí)的內(nèi)容,但是實(shí)際顯示的過程則不是由它來完成。
每個(gè)可見的圖層樹由兩個(gè)相應(yīng)的樹組成:一個(gè)是呈現(xiàn)樹,一個(gè)是渲染樹。
1. UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都是繼承自它。它本身完全是由Core Animation來實(shí)現(xiàn)的。它真正的繪圖部分,是由一個(gè)CALayer類來管理。UIView本身更像是一個(gè)CALayer的管理器,訪問它的跟繪圖和跟坐標(biāo)有關(guān)的屬性,例如frame,bounds等,實(shí)際上內(nèi)部都是在訪問它所包含的CALayer的相關(guān)屬性。
2. UIView有個(gè)重要屬性layer,可以返回它的主CALayer實(shí)例。
//要訪問層,讀取UIView實(shí)例的layer屬性
CALayer *layer = myView.layer
所有從UIView繼承來的對(duì)象都繼承了這個(gè)屬性。這意味著你可以轉(zhuǎn)換、縮放、旋轉(zhuǎn),甚至可以在Navigation bars,Tables,Text boxes等其它的View類上增加動(dòng)畫。每個(gè)UIView都有一個(gè)層,控制著各自的內(nèi)容最終被顯示在屏幕上的方式。
UIView的layerClass方法,可以返回主layer所使用的類,UIView的子類可以通過重載這個(gè)方法,來讓UIView使用不同的CALayer來顯示。代碼示例:
- (class)layerClass {
return([CAEAGLLayerclass]);
}
上述代碼使得某個(gè)UIView的子類使用GL來進(jìn)行繪制。
3. UIView的CALayer類似UIView的子View樹形結(jié)構(gòu),也可以向它的layer上添加子layer,來完成某些特殊的表示。即CALayer層是可以嵌套的。示例代碼:
grayCover = [[CALayer alloc] init];
grayCover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
[self.layer addSubLayer:grayCover];
上述代碼會(huì)在目標(biāo)View上敷上一層黑色透明薄膜的效果。
4. UIView的layer樹形在系統(tǒng)內(nèi)部,被維護(hù)著三份copy。分別是邏輯樹,這里是代碼可以操縱的;動(dòng)畫樹,是一個(gè)中間層,系統(tǒng)就在這一層上更改屬性,進(jìn)行各種渲染操作;顯示樹,其內(nèi)容就是當(dāng)前正被顯示在屏幕上得內(nèi)容。
5. 動(dòng)畫的運(yùn)作:對(duì)UIView的subLayer(非主Layer)屬性進(jìn)行更改,系統(tǒng)將自動(dòng)進(jìn)行動(dòng)畫生成,動(dòng)畫持續(xù)時(shí)間的缺省值似乎是0.5秒。
6. 坐標(biāo)系統(tǒng):CALayer的坐標(biāo)系統(tǒng)比UIView多了一個(gè)anchorPoint屬性,使用CGPoint結(jié)構(gòu)表示,值域是0~1,是個(gè)比例值。這個(gè)點(diǎn)是各種圖形變換的坐標(biāo)原點(diǎn),同時(shí)會(huì)更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。
某layer.anchorPoint = CGPointMake(0.f,0.f);
如果這么設(shè)置,只會(huì)將layer的左上角被挪到原來的中間位置,必須加上這一句:
某layer.position = CGPointMake(0.f,0.f);
最后:layer可以設(shè)置圓角顯示(cornerRadius),也可以設(shè)置陰影?(shadowColor)。但是如果layer樹中某個(gè)layer設(shè)置了圓角,樹種所有l(wèi)ayer的陰影效果都將不顯示了。因此若是要有圓角又要陰影,變通方法只能做兩個(gè)重疊的UIView,一個(gè)的layer顯示圓角,一個(gè)layer顯示陰影......
7.渲染:當(dāng)更新層,改變不能立即顯示在屏幕上。當(dāng)所有的層都準(zhǔn)備好時(shí),可以調(diào)用setNeedsDisplay方法來重繪顯示。
[gameLayer setNeedsDisplay];
若要重繪部分屏幕區(qū)域,請(qǐng)使用setNeedsDisplayInRect:方法,通過在CGRect結(jié)構(gòu)的區(qū)域更新:
[gameLayer setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)];
如果是用的Core Graphics框架來執(zhí)行渲染的話,可以直接渲染Core Graphics的內(nèi)容。用renderInContext:來做這個(gè)事。
[gameLayer renderInContext:UIGraphicsGetCurrentContext()];
8.變換:要在一個(gè)層中添加一個(gè)3D或仿射變換,可以分別設(shè)置層的transform或affineTransform屬性。
characterView.layer.transform = CATransform3DMakeScale(-1.0,-1.0,1.0);
CGAffineTransform transform = CGAffineTransformMakeRotation(45.0);
backgroundView.layer.affineTransform = transform;
9.變形:Quartz Core的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個(gè)三維坐標(biāo)系中以任意角度被旋轉(zhuǎn),縮放和傾斜。CATransform3D的一套方法提供了一些魔術(shù)般的變換效果。