CALayer的分析

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;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,550評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,139評論 5 13
  • 轉載:http://www.lxweimin.com/p/32fcadd12108 每個UIView有一個伙伴稱為l...
    F麥子閱讀 6,276評論 0 13
  • 每個UIView有一個伙伴稱為layer,一個CALayer。UIView實際上并沒有把自己畫到屏幕上;它繪制本身...
    shenzhenboy閱讀 3,134評論 0 17
  • 前言 前面發了一篇iOS 面試的文章,在說到 UIView 和 CALayer 的區別和聯系的時候,被喵神指出沒有...
    Mz楓閱讀 767評論 0 4