iOS開發CoreAnimation解讀之三——幾種常用Layer的使用解析
一、CAEmitterLayer
CAEmitterLayer是CoreAnimation框架中的粒子發射層,在以前的一片博客中有詳細的介紹和范例,這里不再重復,地址如下:
粒子效果的應用和火焰范例:http://my.oschina.net/u/2340880/blog/485095
二、CAGradientLayer
CAGradientLayer是用于色彩梯度展示的layer圖層,通過CAGradientLayer,我們可以很輕松的創建出有過渡效果的色彩圖。其中屬性如下:
用如下代碼創建一個度過視圖的效果:
三、CAReplicatorLayer
CAReplocatorLayer是拷貝視圖容器,我們可以通過它,將其中的子layer進行拷貝,并進行一些差異處理,其中常用屬性方法如下:
四、CAShapeLayer
CAShapeLayer是圖形layer層,我們可以自定義這個層的形狀。先來看其中我們可以使用的屬性和方法:
@property(nullable) CGPathRef path;
path屬性為CAShapeLayer設置一個邊界路徑,例如我們可以創建一個三角形的路徑通過如下代碼:
效果如下:
除此之外,我們還可以設置邊界的線條為虛線,通過下面兩個屬性:
//設置線段的寬度為5px 間距為10px/*
這個數組中還可以繼續添加,會循環進行設置?例如?5?2?1?3?則第一條線段5px,間距2px,第二條線段1px?間距3px再開始第一條線段
*/layer.lineDashPattern?=?@[@05,@10];
//設置從哪個位置開始layer.lineDashPhase?=5;
如下:
五、CATextLayer
CATextLayer可以進行文本的繪制,屬性方法如下:
一、UIView中的CALayer屬性
1.Layer專門負責view的視圖渲染
每一個UIView的對象中都有一個layer這樣的屬性,并且layer會負責view中有關圖形繪制的相關操作,例如我們設置view的背景顏色和設置layer的背景顏色都是有效的,并且,設置view的背景色依然是通過layer來展示的,我們可以寫如下的測試代碼:
可以看出,我們設置view的backgroundColor屬性其實起作用的也是layer的backgroundColor。
2.自定義view默認layer屬性的類
UIView是很多視圖類的父類,根據功能不同,會分出UIImageView,UIScrollerView,UITableView等,CALayer也相似,其也可以根據功能分出許多子類,還可以根據我們的需求自定義一個Layer類。UIView其中的layer默認是CALyer類,我們也可以通過重寫View中的如下方法來使其創建我們需要的layer類:
+(Class)layerClass{}
例如我們自定義一個View類,在自定義一個Layer類,是的自定義的View默認創建的layer是自定義的layer:
在MyView中重寫上述方法:
+(Class)layerClass{return[MyLayerclass];
}
在MyLayer中進行一些自定義:
-?(instancetype)init{self=?[superinit];if(self)?{self.backgroundColor?=?[UIColorredColor].CGColor;????}returnself;}
之后我們使用這個MyView的對象時,layer層的背景色就是紅色的了。
二、幾種系統的Layer類
前邊說過,和UIView相似,CALayer也很據功能衍生出許多子類,系統系統給我們可以使用的有如下幾種:
1.CAEmitterLayer
CoreAnimation框架中的CAEmitterLayer是一個粒子發射器系統,負責粒子的創建和發射源屬性。通過它,我們可以輕松創建出炫酷的粒子效果。
2.CAGradientLayer
CAGradientLayer可以創建出色彩漸變的圖層效果,如下:
3.CAEAGLLayer
CAEAGLLayer可以通過OpenGL ES來進行界面的繪制。
4.CAReplicatorLayer
CAReplicatorLayer是一個layer容器,會對其中的subLayer進行復制和屬性偏移,通過它,可以創建出類似倒影的效果,也可以進行變換復制,如下:
5.CAScrollLayer
CAScrollLayer可以支持其上管理的多個子層進行滑動,但是只能通過代碼進行管理,不能進行用戶點按觸發。
6.CAShapeLayer
CAShapeLayer可以讓我們在layer層是直接繪制出自定義的形狀。
7.CATextLayer
CATextLayer可以通過字符串進行文字的繪制。
8.CATiledLayer
CATiledLayer類似瓦片視圖,可以將繪制分區域進行,常用于一張大的圖片的分不分繪制。
9.CATransformLayer
CATransformLayer用于構建一些3D效果的圖層。
三、設置與調整Layer層的內容
設置層的內容有下面三種方式:
1.可以通過設置CGImage為layer的內容。
2.可以通過代理方法來動態修改或者繪制層的內容。
3.通過自定義CALayer對象來創建層的內容。
當你設置了Layer的內容后,例如設置了一張圖片,內容的尺寸不一定會剛好和layer的尺寸合適,我們可以對其位置的調整,使其達到我們想要的效果,contentsGravity屬性決定了內容對齊與填充方式,它可以分為兩個方面:
1.不改變內容的原始大小
這種模式中不會改變內容的原始大小,如果層的尺寸小于內容的尺寸,則內容會被切割,如果層的尺寸大于內容的尺寸,多出的部分將會顯示層的背景顏色。下面的這些設置方式為這種模式:
每個參數對應的對其模式如下圖:
2.改變內容的尺寸大小
這種模式設置的實際上是一種填充方式,參數如下:
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的接口應用總結
1、創建與初始化layer相關每個參數對應的對其模式如下圖:
2.改變內容的尺寸大小
這種模式設置的實際上是一種填充方式,參數如下:
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的接口應用總結
1、創建與初始化layer相關
//通過類方法創建并初始化一個layer+ (instancetype)layer;
//初始化方法- (instancetype)init;
//通過一個layer創建一個副本- (instancetype)initWithLayer:(id)layer;
2、渲染層layer與模型層layer
在CALayer中,有如下兩個屬性,他們都返回一個CALayer的對象:
//渲染層layer-?(nullableid)presentationLayer;
//模型層layer-?(id)modelLayer;
對于presentationLayer,這個屬性不一定總會返回一個實體對象,只有當進行動畫或者其他渲染的操作時,這個屬性會返回一個在當前屏幕上的layer,不且每一次執行,這個對象都會不同,它是原layer的一個副本presentationLayer的modelLayer就是其實體layer層。
對于modelLayer,它會返回當前的存儲信息的Layer,也是當前的layer對象,始終唯一。
3.一些屬性與方法
+?(nullableid)defaultValueForKey:(NSString*)key;
上面這個屬性用于設置layer中默認屬性的值,我們可以在子類中重寫這個方法來改變默認創建的layer的一些屬性,例如如下代碼,我們創建出來的layer就默認有紅色的背景顏色:
下面這個屬性和內容拉伸相關:
@propertyCGRect?contentsCenter;
這個屬性確定一個矩形區域,當內容進行拉伸或者縮放的時候,這一部分的區域是會被形變的,例如默認設置為(0,0,1,1),則整個內容區域都會參與形變。如果我們設置為(0.25,0.25,0.5,0.5),那么只有中間0.5*0.5比例寬高的區域會被拉伸,四周都不會。
下面這兩個屬性用來設置縮放或拉伸的模式:
//設置縮小的模式@property(copy)NSString*minificationFilter;
//設置放大的模式@property(copy)NSString*magnificationFilter;
//縮放因子@propertyfloatminificationFilterBias;
//模式參數如下
//臨近插值NSString*constkCAFilterNearest;
//線性拉伸NSString*constkCAFilterLinear;
//瓦片復制拉伸NSString*constkCAFilterTrilinear;