CALayer的分析

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;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,696評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,271評論 5 13
  • 轉(zhuǎn)載:http://www.itdecent.cn/p/32fcadd12108 每個(gè)UIView有一個(gè)伙伴稱為l...
    F麥子閱讀 6,594評論 0 13
  • 每個(gè)UIView有一個(gè)伙伴稱為layer,一個(gè)CALayer。UIView實(shí)際上并沒有把自己畫到屏幕上;它繪制本身...
    shenzhenboy閱讀 3,257評論 0 17
  • 前言 前面發(fā)了一篇iOS 面試的文章,在說到 UIView 和 CALayer 的區(qū)別和聯(lián)系的時(shí)候,被喵神指出沒有...
    Mz楓閱讀 858評論 0 4

友情鏈接更多精彩內(nèi)容