《iOS Core Animation Advanced Techniques》學(xué)習(xí)筆記(二)

1. The Layer Tree

Ogres have layers. Onions have layers. You get it? We both have layers.
——Shrek

  • Core Animation 的名字很容易引起誤解茂缚,讓大家都認(rèn)為它的主要目的是實(shí)現(xiàn)動(dòng)畫的,實(shí)際上動(dòng)畫只是 Core Animation 框架的功能之一,Core Animation 框架最開始的名字是 Layer kit。

  • Core Animation 是一個(gè)組裝引擎(compositing engine),它的工作是盡快地將屏幕上的各塊獨(dú)立的內(nèi)容組合起來用來展示尝艘。這些由各獨(dú)立內(nèi)容組合起來的層級結(jié)構(gòu)就是 layer tree

  • Layers 和 Views 的關(guān)系:表面上看,UIView 和 CAlayer 一樣幔睬,都是方形的,可以通過疊加組成層級關(guān)系芹扭,可以展示圖片麻顶、文字、顏色等內(nèi)容舱卡,可以管理子層級的位置辅肾,可以執(zhí)行動(dòng)畫;實(shí)際上灼狰,對于 UIView宛瞄,關(guān)于渲染(rendering)、布局(layout)交胚、動(dòng)畫(animation)的這些工作份汗,都不是由 view 自己處理的,而是 layer 處理的蝴簇;唯一一個(gè) CALyer 不能處理而由 UIView 自己處理的任務(wù)是觸摸事件等用戶交互杯活。

  • 每一個(gè) UIView 都有一個(gè)叫做 layer 的 CALayer 屬性。也就是常說的 backing layer熬词,view 的職責(zé)就是創(chuàng)建和管理這個(gè) layer旁钧,來保證當(dāng)添加或移除 subviews 時(shí),layer 層也在添加或移除相應(yīng)的 layer互拾。

  • 實(shí)際上歪今,UIView 在屏幕上的展示和動(dòng)畫都是由 backing layers 來實(shí)現(xiàn)的,UIView 只是一個(gè) CALayer 的簡單的封裝颜矿,只提供一些像觸摸事件響應(yīng)等 iOS 獨(dú)有的功能寄猩,以及一些 Core Animation 底層功能的高級接口。

  • 為什么 iOS 有這兩個(gè)分別基于 UIView 和 CALayer 的并列層級骑疆?為什么不是一個(gè)能夠管理所有任務(wù)的層級田篇?原因就在于分清職責(zé)替废,避免代碼重復(fù)。

  • 在 iOS 和 Mac OS 上泊柬,對事件(event)和用戶交互(user interaction)的處理方式是不同的椎镣;處理手勢操作和處理鼠標(biāo)鍵盤的機(jī)制是不同的,所以 iOS 中有 UIKit 和 UIView兽赁,而 Mac OS 有 AppKit 和 NSView状答,它們的功能很相似,但是實(shí)現(xiàn)方式卻有顯著的差異闸氮。

  • 渲染(rendering)剪况、布局(layout)、動(dòng)畫(animation)這些功能在iPhone蒲跨、iPad等觸屏設(shè)備上和在 MacBook 等非觸屏設(shè)備上是一樣的译断。通過將這些功能相關(guān)的邏輯單獨(dú)分離出來成 Core Animation 框架,Apple 就能夠在 iOS 和 Mac OS 之間共享這些代碼了或悲,這對于Apple 自家的 OS 開發(fā)團(tuán)隊(duì)以及那些要開發(fā)能在兩個(gè)平臺(tái)都能運(yùn)行的 app 的第三方開發(fā)者來說孙咪,事情變得更簡單了。

  • 事實(shí)上巡语,除了 view hierarchylayer tree 這兩個(gè)層級之外翎蹈,還有 presentation treerender tree 另外兩個(gè)層級,這四個(gè)層級男公,每個(gè)層級都扮演著不同的角色荤堪。

  • 如果 CALayer 不過是 UIView 內(nèi)部的具體實(shí)現(xiàn)而已,那我們?yōu)槭裁催€要去了解它枢赔?從某種程度上來講澄阳,我們確實(shí)不需要接觸 CALayer 就可以直接通過 UIView 得高級接口來繪制圖形,實(shí)現(xiàn)動(dòng)畫踏拜。但是碎赢,使用簡單同時(shí)也意味著失去了靈活性,如果你想實(shí)現(xiàn)一些與接口本身所提供的功能不一樣速梗,或者要使用一些 Apple 沒有在 UIView 中暴露出來的接口時(shí)肮塞,你就需要倒騰一下偏底層的 Core Animation 了。

  • 那么姻锁,有什么事情是 CALayer 能做枕赵,而 UIView 做不了的呢?

  • 繪制帶陰影位隶、圓角烁设、邊框的圖形(Drop shadows, rounded corners, and colored borders

  • 3D 變換(3D transforms and positioning

  • 不是方形的圖形(Nonrectangular bounds

  • 視圖內(nèi)容上加一些遮罩(Alpha masking of content

  • 多步驟動(dòng)畫,非線性動(dòng)畫(Multistep, nonlinear animations

  • 大多數(shù)情況下,相比直接操作獨(dú)立的 CALayer 對象装黑,用帶有 backing layer 的 UIView 對象來繪制圖形,往往更簡單弓熏,因?yàn)?UIVIew 有一些像 autoresizing恋谭、autolayout、event handling 等 CALayer 沒有的功能挽鞠。

  • 只有極個(gè)別情況下疚颊,你應(yīng)該使用獨(dú)立的 CALayer,而不是帶有 backing layer 的 UIView:

    • You might be writing cross-platform code that will also need to work on a Mac.
    • You might be working with multiple CALayer subclasses and have no desire to create new UIView subclasses to hostthem all.
    • You might be doing such performance-critical work that even the negligible overheadof maintaining the extra UIView object makes a measurable difference (although inthat case, you’ll probably want to use something like OpenGL for your drawinganyway).
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末信认,一起剝皮案震驚了整個(gè)濱河市材义,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫁赏,老刑警劉巖其掂,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潦蝇,居然都是意外死亡款熬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門攘乒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贤牛,“玉大人,你說我怎么就攤上這事则酝⊙臭ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵沽讹,是天一觀的道長般卑。 經(jīng)常有香客問我,道長妥泉,這世上最難降的妖魔是什么椭微? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮盲链,結(jié)果婚禮上蝇率,老公的妹妹穿的比我還像新娘。我一直安慰自己刽沾,他們只是感情好本慕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侧漓,像睡著了一般锅尘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天藤违,我揣著相機(jī)與錄音浪腐,去河邊找鬼。 笑死顿乒,一個(gè)胖子當(dāng)著我的面吹牛议街,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播璧榄,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼特漩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骨杂?” 一聲冷哼從身側(cè)響起涂身,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搓蚪,沒想到半個(gè)月后蛤售,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陕凹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年悍抑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杜耙。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搜骡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佑女,到底是詐尸還是另有隱情记靡,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布团驱,位于F島的核電站摸吠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嚎花。R本人自食惡果不足惜寸痢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望紊选。 院中可真熱鬧啼止,春花似錦、人聲如沸兵罢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卖词。三九已至巩那,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背即横。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工噪生, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人东囚。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓杠园,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舔庶。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

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