iOS開發(fā)CoreAnimation解讀之三——幾種常用Layer的使用解析
一、CAEmitterLayer
CAEmitterLayer是CoreAnimation框架中的粒子發(fā)射層,在以前的一片博客中有詳細(xì)的介紹和范例,這里不再重復(fù),地址如下:
粒子效果的應(yīng)用和火焰范例:http://my.oschina.net/u/2340880/blog/485095
二、CAGradientLayer
CAGradientLayer是用于色彩梯度展示的layer圖層,通過CAGradientLayer,我們可以很輕松的創(chuàng)建出有過渡效果的色彩圖。其中屬性如下:

用如下代碼創(chuàng)建一個(gè)度過視圖的效果:

三、CAReplicatorLayer
CAReplocatorLayer是拷貝視圖容器,我們可以通過它,將其中的子layer進(jìn)行拷貝,并進(jìn)行一些差異處理,其中常用屬性方法如下:


四、CAShapeLayer
CAShapeLayer是圖形layer層,我們可以自定義這個(gè)層的形狀。先來看其中我們可以使用的屬性和方法:
@property(nullable) CGPathRef path;
path屬性為CAShapeLayer設(shè)置一個(gè)邊界路徑,例如我們可以創(chuàng)建一個(gè)三角形的路徑通過如下代碼:



效果如下:

除此之外,我們還可以設(shè)置邊界的線條為虛線,通過下面兩個(gè)屬性:
//設(shè)置線段的寬度為5px 間距為10px/*
這個(gè)數(shù)組中還可以繼續(xù)添加,會循環(huán)進(jìn)行設(shè)置?例如?5?2?1?3?則第一條線段5px,間距2px,第二條線段1px?間距3px再開始第一條線段
*/layer.lineDashPattern?=?@[@05,@10];
//設(shè)置從哪個(gè)位置開始layer.lineDashPhase?=5;
如下:

五、CATextLayer
CATextLayer可以進(jìn)行文本的繪制,屬性方法如下:

一、UIView中的CALayer屬性
1.Layer專門負(fù)責(zé)view的視圖渲染
每一個(gè)UIView的對象中都有一個(gè)layer這樣的屬性,并且layer會負(fù)責(zé)view中有關(guān)圖形繪制的相關(guān)操作,例如我們設(shè)置view的背景顏色和設(shè)置layer的背景顏色都是有效的,并且,設(shè)置view的背景色依然是通過layer來展示的,我們可以寫如下的測試代碼:


可以看出,我們設(shè)置view的backgroundColor屬性其實(shí)起作用的也是layer的backgroundColor。
2.自定義view默認(rèn)layer屬性的類
UIView是很多視圖類的父類,根據(jù)功能不同,會分出UIImageView,UIScrollerView,UITableView等,CALayer也相似,其也可以根據(jù)功能分出許多子類,還可以根據(jù)我們的需求自定義一個(gè)Layer類。UIView其中的layer默認(rèn)是CALyer類,我們也可以通過重寫View中的如下方法來使其創(chuàng)建我們需要的layer類:
+(Class)layerClass{}
例如我們自定義一個(gè)View類,在自定義一個(gè)Layer類,是的自定義的View默認(rèn)創(chuàng)建的layer是自定義的layer:

在MyView中重寫上述方法:
+(Class)layerClass{return[MyLayerclass];
}
在MyLayer中進(jìn)行一些自定義:
-?(instancetype)init{self=?[superinit];if(self)?{self.backgroundColor?=?[UIColorredColor].CGColor;????}returnself;}
之后我們使用這個(gè)MyView的對象時(shí),layer層的背景色就是紅色的了。
二、幾種系統(tǒng)的Layer類
前邊說過,和UIView相似,CALayer也很據(jù)功能衍生出許多子類,系統(tǒng)系統(tǒng)給我們可以使用的有如下幾種:
1.CAEmitterLayer
CoreAnimation框架中的CAEmitterLayer是一個(gè)粒子發(fā)射器系統(tǒng),負(fù)責(zé)粒子的創(chuàng)建和發(fā)射源屬性。通過它,我們可以輕松創(chuàng)建出炫酷的粒子效果。
2.CAGradientLayer
CAGradientLayer可以創(chuàng)建出色彩漸變的圖層效果,如下:

3.CAEAGLLayer
CAEAGLLayer可以通過OpenGL ES來進(jìn)行界面的繪制。
4.CAReplicatorLayer
CAReplicatorLayer是一個(gè)layer容器,會對其中的subLayer進(jìn)行復(fù)制和屬性偏移,通過它,可以創(chuàng)建出類似倒影的效果,也可以進(jìn)行變換復(fù)制,如下:

5.CAScrollLayer
CAScrollLayer可以支持其上管理的多個(gè)子層進(jìn)行滑動,但是只能通過代碼進(jìn)行管理,不能進(jìn)行用戶點(diǎn)按觸發(fā)。
6.CAShapeLayer
CAShapeLayer可以讓我們在layer層是直接繪制出自定義的形狀。
7.CATextLayer
CATextLayer可以通過字符串進(jìn)行文字的繪制。
8.CATiledLayer
CATiledLayer類似瓦片視圖,可以將繪制分區(qū)域進(jìn)行,常用于一張大的圖片的分不分繪制。
9.CATransformLayer
CATransformLayer用于構(gòu)建一些3D效果的圖層。
三、設(shè)置與調(diào)整Layer層的內(nèi)容
設(shè)置層的內(nèi)容有下面三種方式:
1.可以通過設(shè)置CGImage為layer的內(nèi)容。
2.可以通過代理方法來動態(tài)修改或者繪制層的內(nèi)容。
3.通過自定義CALayer對象來創(chuàng)建層的內(nèi)容。
當(dāng)你設(shè)置了Layer的內(nèi)容后,例如設(shè)置了一張圖片,內(nèi)容的尺寸不一定會剛好和layer的尺寸合適,我們可以對其位置的調(diào)整,使其達(dá)到我們想要的效果,contentsGravity屬性決定了內(nèi)容對齊與填充方式,它可以分為兩個(gè)方面:
1.不改變內(nèi)容的原始大小
這種模式中不會改變內(nèi)容的原始大小,如果層的尺寸小于內(nèi)容的尺寸,則內(nèi)容會被切割,如果層的尺寸大于內(nèi)容的尺寸,多出的部分將會顯示層的背景顏色。下面的這些設(shè)置方式為這種模式:

每個(gè)參數(shù)對應(yīng)的對其模式如下圖:

2.改變內(nèi)容的尺寸大小
這種模式設(shè)置的實(shí)際上是一種填充方式,參數(shù)如下:
CA_EXTERNNSString*constkCAGravityResize????__OSX_AVAILABLE_STARTING?(__MAC_10_5,?__IPHONE_2_0);CA_EXTERNNSString*constkCAGravityResizeAspect????__OSX_AVAILABLE_STARTING?(__MAC_10_5,?__IPHONE_2_0);CA_EXTERNNSString*constkCAGravityResizeAspectFill????__OSX_AVAILABLE_STARTING?(__MAC_10_5,?__IPHONE_2_0);

四、CALayer的接口應(yīng)用總結(jié)
1、創(chuàng)建與初始化layer相關(guān)每個(gè)參數(shù)對應(yīng)的對其模式如下圖:

2.改變內(nèi)容的尺寸大小
這種模式設(shè)置的實(shí)際上是一種填充方式,參數(shù)如下:
CA_EXTERNNSString*constkCAGravityResize????__OSX_AVAILABLE_STARTING?(__MAC_10_5,?__IPHONE_2_0);CA_EXTERNNSString*constkCAGravityResizeAspect????__OSX_AVAILABLE_STARTING?(__MAC_10_5,?__IPHONE_2_0);CA_EXTERNNSString*constkCAGravityResizeAspectFill????__OSX_AVAILABLE_STARTING?(__MAC_10_5,?__IPHONE_2_0);

四、CALayer的接口應(yīng)用總結(jié)
1、創(chuàng)建與初始化layer相關(guān)
//通過類方法創(chuàng)建并初始化一個(gè)layer+ (instancetype)layer;
//初始化方法- (instancetype)init;
//通過一個(gè)layer創(chuàng)建一個(gè)副本- (instancetype)initWithLayer:(id)layer;
2、渲染層layer與模型層layer
在CALayer中,有如下兩個(gè)屬性,他們都返回一個(gè)CALayer的對象:
//渲染層layer-?(nullableid)presentationLayer;
//模型層layer-?(id)modelLayer;
對于presentationLayer,這個(gè)屬性不一定總會返回一個(gè)實(shí)體對象,只有當(dāng)進(jìn)行動畫或者其他渲染的操作時(shí),這個(gè)屬性會返回一個(gè)在當(dāng)前屏幕上的layer,不且每一次執(zhí)行,這個(gè)對象都會不同,它是原layer的一個(gè)副本presentationLayer的modelLayer就是其實(shí)體layer層。
對于modelLayer,它會返回當(dāng)前的存儲信息的Layer,也是當(dāng)前的layer對象,始終唯一。
3.一些屬性與方法
+?(nullableid)defaultValueForKey:(NSString*)key;
上面這個(gè)屬性用于設(shè)置layer中默認(rèn)屬性的值,我們可以在子類中重寫這個(gè)方法來改變默認(rèn)創(chuàng)建的layer的一些屬性,例如如下代碼,我們創(chuàng)建出來的layer就默認(rèn)有紅色的背景顏色:




下面這個(gè)屬性和內(nèi)容拉伸相關(guān):
@propertyCGRect?contentsCenter;
這個(gè)屬性確定一個(gè)矩形區(qū)域,當(dāng)內(nèi)容進(jìn)行拉伸或者縮放的時(shí)候,這一部分的區(qū)域是會被形變的,例如默認(rèn)設(shè)置為(0,0,1,1),則整個(gè)內(nèi)容區(qū)域都會參與形變。如果我們設(shè)置為(0.25,0.25,0.5,0.5),那么只有中間0.5*0.5比例寬高的區(qū)域會被拉伸,四周都不會。
下面這兩個(gè)屬性用來設(shè)置縮放或拉伸的模式:
//設(shè)置縮小的模式@property(copy)NSString*minificationFilter;
//設(shè)置放大的模式@property(copy)NSString*magnificationFilter;
//縮放因子@propertyfloatminificationFilterBias;
//模式參數(shù)如下
//臨近插值NSString*constkCAFilterNearest;
//線性拉伸NSString*constkCAFilterLinear;
//瓦片復(fù)制拉伸NSString*constkCAFilterTrilinear;
