
一、概念:
UIView不具備顯示功能,擁有顯示功能的是它內(nèi)部的圖層即CALayer屬性
當(dāng)UIView需要顯示到屏幕上時,會調(diào)用DrawRect:方法進行繪圖,并且將所有的內(nèi)容繪制在自己的圖層上Property()CALayer *layer,繪圖完成后,系統(tǒng)會將圖層拷貝到屏幕上,于是就完成了UIView的顯示
UIView 的Layer屬性在系統(tǒng)內(nèi)部,被維護著三份拷貝。分別是邏輯樹,這里是代碼可以操作的;動畫樹,是一個中間層,系統(tǒng)就在這一層上更改屬性,進行各種渲染操作;顯示樹,其內(nèi)容就是當(dāng)前正被顯示在屏幕上的內(nèi)容
UIView 本身更像是一個CALayer的管理器,UIView 有個屬性CALayer *layer ,所有從UIView繼承的對象都繼承了該屬性。因此,可以通過layer 屬性對view 進行 轉(zhuǎn)換、縮放、旋轉(zhuǎn)等操作
二、基本使用
1.通過CALayer設(shè)置邊框的顏色、寬度、圓角
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類型,可以接受內(nèi)容,上面的實例讓layer顯示一張圖片,仔細觀察可以發(fā)現(xiàn)四個圓角的部分露了一個角出來。
設(shè)置Image不是展示在主圖層上的,而是顯示子圖層上的。可以通過設(shè)置一個范圍,設(shè)置超出主圖層的部分把它切掉
self.view.layer.masksToBounds = YES;
或self.view.clipsToBounds = YES;
3. 動畫的運作:對UIView的subLayer(非主Layer)屬性進行更改,系統(tǒng)將自動進行動畫生成,動畫持續(xù)時間的缺省值似乎是0.5秒。
4. 坐標(biāo)系統(tǒng):CALayer的坐標(biāo)系統(tǒng)比UIView多了一個anchorPoint屬性,使用CGPoint結(jié)構(gòu)表示,值域是0~1,是個比例值。這個點是各種圖形變換的坐標(biāo)原點,同時會更改layer的position的位置,它的缺省值是{0.5,0.5},即在layer的中央。
某layer.anchorPoint = CGPointMake(0.f,0.f);
5.渲染:當(dāng)更新層,改變不能立即顯示在屏幕上。當(dāng)所有的層都準備好時,可以調(diào)用setNeedsDisplay方法來重繪顯示。 [gameLayer setNeedsDisplay];
? 若要重繪部分屏幕區(qū)域,請使用setNeedsDisplayInRect:方法,通過在CGRect結(jié)構(gòu)的區(qū)域更新: [gameLayer
? setNeedsDisplayInRect:CGRectMake(150.0,100.0,50.0,75.0)]; 如果是用的CoreGraphics框架來執(zhí)行渲染的話,可以直接渲染Core Graphics的內(nèi)容。用renderInContext:來做這個事。 [gameLayer renderInContext:UIGraphicsGetCurrentContext()];
? 6.變換:要在一個層中添加一個3D或仿射變換,可以分別設(shè)置層的transform或affineTransform屬性。 characterView.layer.transform =CATransform3DMakeScale(-1.0,-1.0,1.0);
? CGAffineTransform transform =CGAffineTransformMakeRotation(45.0);
? backgroundView.layer.affineTransform = transform;
? 7.變形:Quartz Core的渲染能力,使二維圖像可以被自由操縱,就好像是三維的。圖像可以在一個三維坐標(biāo)系中以任意角度被旋轉(zhuǎn),縮放和傾斜。CATransform3D的一套方法提供了一些魔術(shù)般的變換效果。