CoreAnimation(一)-圖層

圖層樹

  • 圖層與視圖
  • 圖層的能力
  • 使用圖層
  • 總結(jié)

Core Animation是一個(gè)復(fù)合引擎, 他的職責(zé)是盡可能的組合屏幕的不同的可視內(nèi)容, 這個(gè)內(nèi)容是被分解為獨(dú)立的圖層, 存儲(chǔ)在一個(gè)叫做圖層樹的體系之中, 于是這個(gè)樹形成了UIKit以及iOS應(yīng)用程序當(dāng)中你能在屏幕上看到的一切的基礎(chǔ)

在討論動(dòng)畫之前, 我們將從圖層樹開始, 涉及一下core Animation的靜態(tài)組合以及布局特性

一: 圖層與視圖

一個(gè)視圖就是在屏幕上顯示的一個(gè)矩形塊, 他能夠攔截類似鼠標(biāo)點(diǎn)擊或者觸摸手勢(shì)等輸入行為, 視圖在層級(jí)關(guān)系中可以互相嵌套, 一個(gè)視圖可以管理他的所有子視圖的位置


一種典型的iOS屏幕和形成視圖的層級(jí)關(guān)系

在iOS中, 所有的視圖都是從一個(gè)叫做UIView的基類派生出來的, UIView可以處理觸摸事件, 可以支持基于core Graphics繪圖, 可以做仿射變換(旋轉(zhuǎn)或者縮放). 或者簡(jiǎn)單的類似滑動(dòng)或者漸變的動(dòng)畫

1.1: CALayer

CALayer類在概念上和UIView相似, 同樣也是一些被層級(jí)關(guān)系樹管理的矩形塊, 同樣也可以包含一些內(nèi)容(圖片买猖、文本、背景色)管理子圖層的位置, 它們有有些方法和屬性用來做動(dòng)畫和變換, 和UIView最大的不同是CALayer不處理用戶的交互.

CALayer并不清楚具體的響應(yīng)鏈(iOS通過視圖層級(jí)關(guān)系來傳送觸摸事件的機(jī)制), 于是他不能夠響應(yīng)事件, 即使她提供了一些方法來判斷是否一個(gè)觸電是否在圖層范圍內(nèi)

1.2: 平行的層級(jí)關(guān)系

每個(gè)UIView都有一個(gè)CALayer實(shí)例的圖層屬性, 也就是所謂的backing layer, 視圖的職責(zé)是創(chuàng)建并管理這個(gè)圖層, 以確保子視圖在層級(jí)關(guān)系中添加和移除的時(shí)候, 他們關(guān)聯(lián)頁(yè)同樣對(duì)應(yīng)層級(jí)關(guān)系書當(dāng)中的相同操作
[圖片上傳失敗...(image-e7891f-1512703987307)]

實(shí)際上這些背后關(guān)聯(lián)的圖層礙事真正用來在屏幕上下顯示和做動(dòng)畫的邓尤, UIView僅僅是對(duì)他的封裝, 提供了一些iOS相關(guān)處理觸摸的具體功能, 以及Core Animation底層方法的高級(jí)接口

但是為什么iOS要基于UIViewCALayer提供兩個(gè)平行的層級(jí)關(guān)系那敦跌? 為什么不用一個(gè)簡(jiǎn)單的層級(jí)來處理所有的事情那? 原因在于職責(zé)分離, 這樣能避免很多重復(fù)代碼, 在iOS和MacOS兩個(gè)平臺(tái)下, 事情和用戶交互很多地方的不同, 基于多點(diǎn)觸控的用戶界面和基于鼠標(biāo)鍵盤有著本質(zhì)的區(qū)別, 這就是iOS有UIKit和UIView, 但是Mac OS有AppKit和NSView的原因, 他們功能很相似, 但是在實(shí)現(xiàn)上有著顯著的區(qū)別

繪圖慧库、布局和動(dòng)畫, 相比之下就是類似Mac比較本和桌面系列一樣應(yīng)用于iPhone和Ipad觸屏的概念, 吧這種功能的邏輯分開并應(yīng)用到獨(dú)立的Core Animation框架中, 蘋果就能夠在iOS和Mac OS之間共享代碼, 使得對(duì)蘋果自己的OS開發(fā)團(tuán)隊(duì)和第三方開發(fā)者去方法兩個(gè)平臺(tái)更加便捷

實(shí)際上跷跪, 這里并不是兩個(gè)層級(jí)關(guān)系, 而是四個(gè),每一個(gè)都扮演不同的角色, 除了視圖層級(jí)和圖層樹之外, 還存在呈現(xiàn)樹和渲染樹.

1.3: 圖層的能力

如果說CALayer是UIView的內(nèi)部實(shí)現(xiàn)細(xì)節(jié), 那我們?yōu)槭裁匆娴牧私馑麉龋?蘋果當(dāng)然為我們提供了優(yōu)美簡(jiǎn)潔的UIView接口, 那么我們是否就沒有必要直接處理Core Animation

某種意義上說的的確實(shí)這樣的, 對(duì)一些簡(jiǎn)單的需求來說, 我們沒有必要處理CALayer, 因?yàn)樘O果已經(jīng)通過UIView的高級(jí)API間接的使得動(dòng)畫變得很簡(jiǎn)單

我們已經(jīng)證實(shí)圖層不能像視圖那樣帶來一些靈活上的缺陷, UIView缺少CALayer的功能

  • 陰影 圓角 帶顏色的邊框
  • 3D變換
  • 非矩形范圍
  • 透明遮罩
  • 多級(jí)非線性動(dòng)畫
1.4:使用圖層

首先我們來創(chuàng)建一個(gè)簡(jiǎn)單的圖層, 從屏幕中央創(chuàng)建一個(gè)小視圖(200*200),


灰色的視圖有一個(gè)白色的小視圖

我們來創(chuàng)建一個(gè)CALayer, 并且把它作為我們視圖相關(guān)圖層的子圖層, 我們創(chuàng)建一個(gè)CALayer, 設(shè)置他的backgroundColor屬性齐板, 然后添加到相應(yīng)的Layer上吵瞻。

[圖片上傳失敗...(image-60588-1512703987307)]

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong)UIView *whiteView;
@property (nonatomic, strong)CALayer *blueLayer;
@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor grayColor];
  [self.view addSubview:self.whiteView];
  [self.whiteView.layer addSublayer:self.blueLayer];
}


- (UIView *)whiteView{
  if (_whiteView == nil) {
    _whiteView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
    _whiteView.backgroundColor = [UIColor whiteColor];
    _whiteView.center = self.view.center;
  }
  return _whiteView;
}

- (CALayer *)blueLayer{
  if (_blueLayer == nil) {
    _blueLayer = [CALayer layer];
    _blueLayer.frame = CGRectMake(50, 50, 100, 100);

    _blueLayer.backgroundColor = [UIColor blueColor].CGColor;
  }
  return _blueLayer;
}
@end

使用圖層關(guān)聯(lián)的視圖而不是CALayer的好處在于, 你可以使用CALayer底層的特性的同時(shí), 也可以使用UIView的高級(jí)API(自動(dòng)排版甘磨、布局和事件處理)

如果滿足一下的條件, 你可能需要使用CALayer而不是UIView

  • 開發(fā)同時(shí)可以在Mac OS上允許的跨平臺(tái)應(yīng)用
  • 使用多種CALayer的子類, 并且不想創(chuàng)建額外的UIView去包裝他們所有
  • 做一些對(duì)性能特別挑剔的工作, 比如對(duì)UIView一些可以忽略不計(jì)的操作都會(huì)引起顯著的不同

處理視圖比處理Layer要方便一些

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末橡羞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子济舆,更是在濱河造成了極大的恐慌卿泽,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吗冤,死亡現(xiàn)場(chǎng)離奇詭異又厉,居然都是意外死亡九府,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門覆致,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侄旬,“玉大人,你說我怎么就攤上這事煌妈±芨幔” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵璧诵,是天一觀的道長(zhǎng)汰蜘。 經(jīng)常有香客問我,道長(zhǎng)之宿,這世上最難降的妖魔是什么族操? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮比被,結(jié)果婚禮上色难,老公的妹妹穿的比我還像新娘。我一直安慰自己等缀,他們只是感情好枷莉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布尺迂。 她就那樣靜靜地躺著笤妙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪噪裕。 梳的紋絲不亂的頭發(fā)上蹲盘,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音州疾,去河邊找鬼辜限。 笑死,一個(gè)胖子當(dāng)著我的面吹牛严蓖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氧急,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼颗胡,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了吩坝?” 一聲冷哼從身側(cè)響起毒姨,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钉寝,沒想到半個(gè)月后弧呐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闸迷,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年俘枫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腥沽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸠蚪,死狀恐怖今阳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情茅信,我是刑警寧澤盾舌,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站蘸鲸,受9級(jí)特大地震影響妖谴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酌摇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一膝舅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妙痹,春花似錦铸史、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至耿芹,卻和暖如春崭篡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吧秕。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工琉闪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砸彬。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓颠毙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砂碉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛀蜜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容