Core Animation: 1 Layer

什么是Layer

?Layer對(duì)象是一種由3D空間組織而成的2D平面,也是Core Animation的核心對(duì)象院溺,類似于View岖妄,Layer管理了幾何圖形的視覺信息,與View不同的是够挂,layer本身并不定義自身的樣子(不會(huì)像button等其它控件一樣有一個(gè)預(yù)定義的樣式),Layer僅僅管理了位圖(bitmap)的狀態(tài)信息锰什,位圖其實(shí)就是UIView等子類在屏幕上所呈現(xiàn)的樣式下硕,也可以把位圖看做是一張圖片丁逝,layer被用來管理這些信息汁胆,所以蘋果把Layer看作是模型對(duì)象(model objects)梭姓。Core Animation就是使用Layer的各種屬性信息,然后將layer的位圖和狀態(tài)信息傳遞給圖形硬件(graphics hardware)嫩码,圖形硬件將使用這些信息來進(jìn)行動(dòng)畫和快速渲染誉尖。
?Layer 與 View的不同主要體現(xiàn)在Layer 不能夠響應(yīng)事件,無法參與到響應(yīng)鏈中铸题,Layer為View的視覺呈現(xiàn)提供了更高效的方式铡恕,Layer是View的基礎(chǔ)設(shè)施。

圖1

?默認(rèn)情況下丢间,如果修改Layer中的某個(gè)屬性探熔,Layer的數(shù)據(jù)和狀態(tài)信息會(huì)從該Layer的視覺呈現(xiàn)(位圖)解耦出來,然后交給Core Animation進(jìn)行動(dòng)畫處理烘挫,Core Animation會(huì)通過圖形硬件生成一幀一幀的繪制诀艰,來呈現(xiàn)出動(dòng)畫效果,開發(fā)者只需要指定動(dòng)畫的初始值和終值饮六。

Layer 使用兩種坐標(biāo)系統(tǒng)

?Layer使用基于點(diǎn)的坐標(biāo)系統(tǒng)(point-based coordinate)和單元坐標(biāo)系其垄,基于點(diǎn)的坐標(biāo)系統(tǒng)通常將坐標(biāo)值直接映射到屏幕上(例如position),還有一些屬性是基于其它值卤橄,與屏幕無關(guān)绿满,例如anchorPoint,通過在CGPoint結(jié)構(gòu)體中傳遞0~1之間的值窟扑,用來確定錨點(diǎn)的位置喇颁,該值為相對(duì)于當(dāng)前l(fā)ayer的bounds。在iOS系統(tǒng)中嚎货,坐標(biāo)的起始位置與UIView的坐標(biāo)的起始坐標(biāo)相同无牵,左上角為(0,0)點(diǎn)。

錨點(diǎn): anchorPoint

?幾何相關(guān)的操作都是相對(duì)于layer的錨點(diǎn)進(jìn)行的厂抖,例如position茎毁、rotate、scale等操作忱辅,默認(rèn)情況七蜘,anchorPoint的值為CGPoint(0.5, 0.5),也就是layer的中心位置:

    func addLayer() {
        let layer = CALayer.init()
        let img = UIImage.init(named: "a")
        layer.contentsGravity = CALayerContentsGravity.center
        layer.contents = img?.cgImage
        layer.delegate = self
        layer.frame = CGRect.init(x: 0, y: 0, width: 100, height: 100)  // 1
        layer.borderWidth = 1 / 3
        layer.contentsScale = 3
        layer.borderColor = UIColor.black.cgColor
        self.view.layer.addSublayer(layer)
        print(layer.position)    //(50.0, 50.0)
        print(layer.frame)       //(0.0, 0.0, 100.0, 100.0)
    }

    @IBAction func clickBtn(_ sender: Any) {
        let layer = self.view.layer.sublayers!.last!
        layer.anchorPoint = CGPoint.init(x: 0, y: 0)     // 2
        print(layer.position)   //(50.0, 50.0)
        print(layer.frame)      //(50.0, 50.0, 100.0, 100.0)
    }

1處代碼指定了layer的frame為(0,0,100,100)墙懂,默認(rèn)的錨點(diǎn)為(0.5,0.5)橡卤,此時(shí)的position為:(50,50),當(dāng)重新設(shè)置了錨點(diǎn)位置2為(0,0)损搬,此時(shí)position沒有變化碧库,但是frame的起始位置變?yōu)?50,50)柜与,可以看到,layer的frame.origin屬性可以由anchorPoint和position確定

frame.origin.x = position.x - anchorPoint.x * bounds.size.width
frame.origin.y = position.y - anchorPoint.y * bounds.size.height

結(jié)果如下圖所示:

圖2

?再來看一下anchorPoint是如何影響旋轉(zhuǎn)的嵌灰,anchorPoint 分別為:(0.5, 0.5) 和(0, 0):

圖3
圖4

?Layer的anchorPoint屬性會(huì)影響動(dòng)畫的基準(zhǔn)點(diǎn)弄匕,例如旋轉(zhuǎn)時(shí)會(huì)作為中心點(diǎn)。

三種Layer Tree

?Core Animation 有三種類型的Layer:

  1. model layer tree:就是做動(dòng)畫時(shí)最常使用的layer tree沽瞭,這種類型保存了Core animation進(jìn)行動(dòng)畫的信息迁匠,如果程序需要修改Layer的屬性的話,修改的就是這一類的Layer驹溃。
  2. Presentation tree:包含了執(zhí)行動(dòng)畫過程中所需要的Layer城丧,雖然這部分Layer也包含了Core Animation執(zhí)行動(dòng)畫時(shí)需要的信息,但是這些數(shù)據(jù)都只是臨時(shí)的豌鹤,不應(yīng)該去修改這部分信息亡哄,但是可以通過 獲取Presetation layer tree的屬性,創(chuàng)建新的動(dòng)畫布疙。
  3. Render tree蚊惯,這部分layer是用來執(zhí)行動(dòng)畫的,但是是私有的拐辽。
    ?每一種Layer都是有層級(jí)結(jié)構(gòu)拣挪,類似于views,Layer tree中的每一個(gè)對(duì)象俱诸,都有一個(gè)與之對(duì)應(yīng)的Presentation tree和 Render tree:
圖5

參考文檔:
Apple:Core Animation Programming Guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菠劝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子睁搭,更是在濱河造成了極大的恐慌赶诊,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件园骆,死亡現(xiàn)場(chǎng)離奇詭異舔痪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)锌唾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門锄码,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人晌涕,你說我怎么就攤上這事滋捶。” “怎么了余黎?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵重窟,是天一觀的道長。 經(jīng)常有香客問我惧财,道長巡扇,這世上最難降的妖魔是什么扭仁? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮厅翔,結(jié)果婚禮上乖坠,老公的妹妹穿的比我還像新娘。我一直安慰自己知给,他們只是感情好瓤帚,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布描姚。 她就那樣靜靜地躺著涩赢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轩勘。 梳的紋絲不亂的頭發(fā)上筒扒,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音绊寻,去河邊找鬼花墩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛澄步,可吹牛的內(nèi)容都是我干的冰蘑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼村缸,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼祠肥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梯皿,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤仇箱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后东羹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剂桥,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年属提,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了权逗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冤议,死狀恐怖斟薇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情求类,我是刑警寧澤奔垦,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站尸疆,受9級(jí)特大地震影響椿猎,放射性物質(zhì)發(fā)生泄漏惶岭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一犯眠、第九天 我趴在偏房一處隱蔽的房頂上張望按灶。 院中可真熱鬧,春花似錦筐咧、人聲如沸鸯旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铺罢。三九已至,卻和暖如春残炮,著一層夾襖步出監(jiān)牢的瞬間韭赘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工势就, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泉瞻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓苞冯,卻偏偏與公主長得像袖牙,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舅锄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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