前言
? ? ? 相信大部份iOS開(kāi)發(fā)者在實(shí)現(xiàn)一些基礎(chǔ)動(dòng)畫(huà)時(shí)會(huì)感嘆動(dòng)畫(huà)API的簡(jiǎn)便及動(dòng)畫(huà)效果的真實(shí)性得院,動(dòng)畫(huà)是iOS的一大特色傻铣,Core Animation的存在使得我們實(shí)現(xiàn)一些基礎(chǔ)動(dòng)畫(huà)變得十分簡(jiǎn)單,本文將會(huì)講述iOS一些動(dòng)畫(huà)的基礎(chǔ)知識(shí)祥绞,以及動(dòng)畫(huà)與事件鏈沖突的處理非洲。
目錄
-Core Animation
-Core Animation動(dòng)畫(huà)
-UIKit動(dòng)畫(huà)
-Core Animation動(dòng)畫(huà)與觸摸響應(yīng)
-定時(shí)動(dòng)畫(huà)
-Core Animation動(dòng)畫(huà)VS定時(shí)動(dòng)畫(huà)
-總結(jié)
Core Animation
? ? ? 當(dāng)提起Core Animation,可能有很多人的第一反應(yīng)是蜕径,Core Animation是用來(lái)做動(dòng)畫(huà)的两踏,這個(gè)回答沒(méi)有錯(cuò),Core Animation確實(shí)是用來(lái)做動(dòng)畫(huà)兜喻,而且提供了非常簡(jiǎn)便的動(dòng)畫(huà)API梦染,但這里有一個(gè)誤區(qū),很多人會(huì)認(rèn)為Core Animation只是用來(lái)做動(dòng)畫(huà)的虹统,或者大家在網(wǎng)上找到的大部份跟Core Animation相關(guān)的資料都只是講述了如果使用Core Animation實(shí)現(xiàn)動(dòng)畫(huà)弓坞,這對(duì)Core Animation的認(rèn)知是很片面的,Core Animation不僅僅只有動(dòng)畫(huà)车荔,相反渡冻,動(dòng)畫(huà)只是Core Animation的一小部份。
? ? ? 在iOS端忧便,你在屏幕上看到的一切都是由Core Animation來(lái)完成的族吻,但Core Animation并不做實(shí)際的繪制渲染的工作帽借,實(shí)際的繪制渲染工作由繪制渲染系統(tǒng)來(lái)完成,Core Animation是一個(gè)中間層框架超歌。
? ? ? 從顯示的整個(gè)流程可以得知砍艾,Core Animation為其它框架提供數(shù)據(jù)和傳遞數(shù)據(jù),當(dāng)然Core Animation也會(huì)對(duì)數(shù)據(jù)進(jìn)行處理巍举,像坐標(biāo)脆荷,矩形計(jì)算,創(chuàng)建OpenGL紋理等懊悯。從上圖可以看到蜓谋,iOS的整個(gè)顯示流程沒(méi)UIKit什么事,這跟Mac OS的處理是有所不同的炭分,iOS的顯示是默認(rèn)建立在Core Animation之上桃焕,顯示層的處理是通過(guò)Core Animation來(lái)完成,而Mac OS并不依賴于Core Animation捧毛。由于Core Animation在iOS端的位置观堂,所以你如何使用Core Animation這將會(huì)對(duì)性能產(chǎn)生極大的影響。
? ? ? 當(dāng)你打算向可視化元素進(jìn)階的時(shí)候呀忧,Core Animation會(huì)是你進(jìn)階的第一步师痕,也是非常關(guān)鍵的一步。關(guān)于Core Animation荐虐,可以看《iOS Core Animation Advanced Techniques》這本書(shū)七兜,不知道這本書(shū)是否有更新,因?yàn)槲业谝淮谓佑|這本書(shū)已經(jīng)是三年前了福扬,即使沒(méi)有更新腕铸,也沒(méi)有關(guān)系,這并不影響書(shū)的質(zhì)量铛碑,這本書(shū)可以讓你全面了解到Core Animation狠裹,當(dāng)然你還可以查閱蘋果的官方文檔,或者網(wǎng)上的技術(shù)文汽烦,但個(gè)人推薦看專題書(shū)涛菠,因?yàn)閷n}書(shū)的全面性是網(wǎng)上的技術(shù)文無(wú)法給予的。
Core Animation動(dòng)畫(huà)
? ? ? Core Animation動(dòng)畫(huà)有兩種形式撇吞,分別是顯式動(dòng)畫(huà)和隱式動(dòng)畫(huà)俗冻,但不管以哪種形式實(shí)現(xiàn)動(dòng)畫(huà),都是基于CAAnimation來(lái)實(shí)現(xiàn)的牍颈,所以這兩種動(dòng)畫(huà)形式的主要差異在于迄薄,是否顯式創(chuàng)建CAAnimation對(duì)象來(lái)實(shí)現(xiàn)動(dòng)畫(huà),當(dāng)然它們還存在其它的差異煮岁,例如讥蔽,隱式動(dòng)畫(huà)是基于CABasicAnimation對(duì)來(lái)實(shí)現(xiàn)的涣易,而顯式動(dòng)畫(huà)可以有更多的選擇,可以是CABasicAnimation冶伞,CAKeyframeAnimation新症,CATransition等。
? ? ? 對(duì)于獨(dú)立CALayer而言响禽,隱式動(dòng)畫(huà)是默認(rèn)開(kāi)啟的徒爹,只需要更改可動(dòng)畫(huà)屬性就會(huì)觸發(fā)隱式動(dòng)畫(huà),但對(duì)于UIView的Backing Layer而言芋类,隱式動(dòng)畫(huà)是默認(rèn)關(guān)閉的瀑焦。當(dāng)更改獨(dú)立CALayer的可動(dòng)畫(huà)屬性時(shí),Core Animation會(huì)為我們創(chuàng)建默認(rèn)的動(dòng)畫(huà)對(duì)象來(lái)實(shí)現(xiàn)相應(yīng)的動(dòng)畫(huà)梗肝,但Core Animation又以什么作為標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn)這些動(dòng)畫(huà)呢?隱式動(dòng)畫(huà)的大部份參數(shù)由事務(wù)(CATransaction)來(lái)決定铺董,其中包括巫击,動(dòng)畫(huà)時(shí)間,動(dòng)畫(huà)緩沖等精续。
? ? ? 雖然隱式動(dòng)畫(huà)的大部份參數(shù)由CATransaction來(lái)決定坝锰,但我們奇怪地發(fā)現(xiàn),在代碼中并沒(méi)有出現(xiàn)CATransaction重付,WHY顷级?這是由于CATransaction和NSAutoreleasePool一樣,也分為隱式CATransaction和顯式CATransaction确垫,而CATransaction對(duì)隱式動(dòng)畫(huà)的管理方式與NSAutoreleasePool對(duì)內(nèi)存的管理方式也十分相似弓颈,[CATransaction begin]方法是CATransaction的開(kāi)始,而[CATransaction commit]則是CATransaction的結(jié)束删掀,中間便是CATransaction的作用域翔冀,需要把更改可動(dòng)畫(huà)屬性的操作放在CATransaction的作用域內(nèi)披泪,Core Animation才會(huì)創(chuàng)建相應(yīng)的隱式動(dòng)畫(huà)。
? ? ? 上圖為CATransaction的顯式創(chuàng)建款票,顯式創(chuàng)建CATransaction常常被用于關(guān)閉隱式動(dòng)畫(huà)(獨(dú)立的CALayer對(duì)象默認(rèn)開(kāi)啟隱式動(dòng)畫(huà),需要手動(dòng)關(guān)閉)和調(diào)整動(dòng)畫(huà)的時(shí)間艾少。隱式CATransaction是在RunLoop的一次Loop開(kāi)始時(shí)begin卡乾,Loop結(jié)束時(shí)commit姆钉,正因?yàn)橛须[式CATransaction的存在抄瓦,所以當(dāng)你更改獨(dú)立CALayer的可動(dòng)畫(huà)屬性時(shí),Core Animation會(huì)為此創(chuàng)建隱式動(dòng)畫(huà)钙姊。CATransaction和NSAutoreleasePool一樣,可以嵌套處理埂伦。
? ? ?需要注意的是,不管是顯式動(dòng)畫(huà)還是隱式動(dòng)畫(huà)沾谜,動(dòng)畫(huà)屬性的初始值要不同于目標(biāo)值才會(huì)產(chǎn)生動(dòng)畫(huà)。Core Animation動(dòng)畫(huà)過(guò)程中基跑,顯示在屏幕上的是呈現(xiàn)樹(shù)的對(duì)象婚温,而不是圖層樹(shù)的對(duì)象。
UIKit動(dòng)畫(huà)
? ? ? 除了Core Animation的動(dòng)畫(huà)API媳否,蘋果還為我們準(zhǔn)備了UIKit的動(dòng)畫(huà)API栅螟。UIKit實(shí)現(xiàn)的動(dòng)畫(huà)效果往往都可以滿足你對(duì)動(dòng)畫(huà)的需求,而且實(shí)現(xiàn)代碼非常簡(jiǎn)單篱竭,就像Core Animation的隱式動(dòng)畫(huà)一樣力图,只需要在UIKit事務(wù)中修改相應(yīng)可動(dòng)畫(huà)屬性即可,所以掺逼,一般情況下UIKit動(dòng)畫(huà)是你優(yōu)先選擇的方式吃媒,但這里有一個(gè)誤區(qū),網(wǎng)上有很多技術(shù)文在講述iOS動(dòng)畫(huà)的時(shí)候吕喘,會(huì)把UIKit動(dòng)畫(huà)和Core Animation動(dòng)畫(huà)定義成兩種完全不同的處理方式赘那,并且認(rèn)為Core Animation動(dòng)畫(huà)的性能會(huì)更優(yōu)一些,但事實(shí)并非如此氯质,UIKit動(dòng)畫(huà)和Core Animation動(dòng)畫(huà)是相關(guān)連的漓概,它們的關(guān)系就好像NSOperation和GCD一樣,UIKit動(dòng)畫(huà)是建立在Core Animation動(dòng)畫(huà)之上的病梢,下面我們來(lái)簡(jiǎn)單地驗(yàn)證一下胃珍。
? ? ? 一個(gè)簡(jiǎn)單的平移動(dòng)畫(huà),只需要實(shí)現(xiàn)以上UIKit動(dòng)畫(huà)代碼即可蜓陌。
? ? ? 我們需要知道的是Core Animation層在UIKit動(dòng)畫(huà)前后的變化觅彰,通過(guò)監(jiān)聽(tīng)animationView.layer.animationKeys來(lái)獲取相關(guān)信息。
? ? ? 從輸出的信息可以看到钮热,UIKit動(dòng)畫(huà)其內(nèi)部實(shí)現(xiàn)是Core Animation動(dòng)畫(huà)填抬。UIView對(duì)象的Backing Layer的隱式動(dòng)畫(huà)是默認(rèn)關(guān)閉的,如果想開(kāi)啟需要使用UIKit的事務(wù)隧期。
? ? ? UIKit事務(wù)繼承了Core Animation事務(wù)(CATransaction)的所有功能飒责,并且在此基礎(chǔ)上做了許多擴(kuò)展赘娄,像觸摸響應(yīng),更多的動(dòng)畫(huà)對(duì)象等宏蛉。作為Core Animation動(dòng)畫(huà)的一個(gè)抽象物遣臼,UIKit雖然提供了非常簡(jiǎn)便的API來(lái)實(shí)現(xiàn)動(dòng)畫(huà),但UIKit動(dòng)畫(huà)畢竟是Core Animation動(dòng)畫(huà)的一個(gè)抽象物拾并,能提供的效果還是很有限的揍堰。
Core Animation動(dòng)畫(huà)與觸摸響應(yīng)
? ? ? 當(dāng)我們觸摸屏幕時(shí),系統(tǒng)就會(huì)把這個(gè)觸摸事件傳遞給相應(yīng)Application(本文不會(huì)講述觸摸事件是如何產(chǎn)生)嗅义,Application接收到觸摸事件后屏歹,執(zhí)行_UIApplicationHandleEventQueue()函數(shù)(這是一個(gè)Source0的回調(diào)),把觸摸事件轉(zhuǎn)換成UIEvent并開(kāi)始傳遞和處理事件之碗。
? ? ? Application處理觸摸事件主要分為以下兩步:
? ? ? ? 1).獲取Hit-Test View蝙眶。
? ? ? ? 2).尋找響應(yīng)者處理事件。
? ? ? 響應(yīng)鏈?zhǔn)怯梢唤M連接在一起的響應(yīng)者組成褪那,UIResponder是所有響應(yīng)者的基類械馆,響應(yīng)者的類型不是唯一的,不同的系統(tǒng)事件對(duì)應(yīng)著不同類型的響應(yīng)者武通,而觸摸事件的響應(yīng)者主要是UIApplication對(duì)象,UIViewController對(duì)象和UIView對(duì)象珊搀,UIApplication對(duì)象是響應(yīng)鏈的第一個(gè)節(jié)點(diǎn),也是最后一個(gè)響應(yīng)事件的對(duì)象囚枪。
? ? ? 以上兩步操作由兩個(gè)不同的函數(shù)完成,_UIApplicationHandleDigitizerEvent()函數(shù)用于獲取Hit-Test View链沼,[UIApplication sendEvent:]函數(shù)用于查找可以處理事件的響應(yīng)者沛鸵,當(dāng)然這兩個(gè)函數(shù)是在_UIApplicationHandleEventQueue()中被調(diào)用的,調(diào)用關(guān)系如下圖疾捍。
? ? ? _UIApplicationHandleDigitizerEvent()函數(shù)通過(guò)調(diào)用UIView對(duì)象的hitTest: withEvent:函數(shù)來(lái)獲取Hit-Test View乱豆,hitTest: withEvent:函數(shù)簡(jiǎn)潔的偽代碼如下吊趾。
? ? ? 一個(gè)UIWindow的hitTest: withEvent:函數(shù)返回值是當(dāng)前Window的Hit-Test View,Hit-Test View是響應(yīng)鏈中第一個(gè)被檢測(cè)是否能處理觸摸事件的對(duì)象揩尸。獲取Hit-Test View后,調(diào)用[UIApplication sendEvent:]函數(shù)從響應(yīng)鏈中尋找響應(yīng)者處理事件蜡峰,當(dāng)找到響應(yīng)者處理觸摸事件后朗恳,本次觸摸事件處理結(jié)束(當(dāng)然,你也可以通過(guò)重寫一些函數(shù)使事件繼續(xù)傳遞)油航。
? ? ? 跟很多開(kāi)發(fā)者交流的時(shí)候發(fā)現(xiàn)一個(gè)誤區(qū)怀浆,很多人認(rèn)為響應(yīng)鏈?zhǔn)窃谟|摸事件發(fā)生時(shí)才生成的,但事實(shí)并非如此镰踏,若響應(yīng)鏈在觸摸事件發(fā)生時(shí)才生成沙合,那么只要不發(fā)生觸摸事件就不會(huì)存在響應(yīng)鏈,但事實(shí)上绊率,即使不發(fā)生觸摸事件,我們也可以通過(guò)nextResponder來(lái)獲取上一級(jí)響應(yīng)者滤否。UIKit在UIResponder對(duì)象關(guān)系確立的同時(shí)生成響應(yīng)鏈最仑,響應(yīng)鏈與視圖的層級(jí)結(jié)構(gòu)也是一一對(duì)應(yīng)的泥彤,一般情況下,父視圖是子視圖的上一級(jí)響應(yīng)者全景,當(dāng)然,也有一些特殊的情況滞伟,像UIViewController根視圖的上一級(jí)響應(yīng)者是UIViewController而不是父視圖(下圖是官方文檔的圖)。
? ? ? 就像圖8野崇,圖9展示的那樣,一般情況下_UIApplicationHandleDigitizerEvent()函數(shù)獲取Hit-Test View的過(guò)程還是比較簡(jiǎn)單的乓梨,但如果視圖加上了Core Animation動(dòng)畫(huà)扶镀,那么獲取Hit-Test View的過(guò)程就變得相對(duì)復(fù)雜了焰轻。
? ? ? 正常情況下,判斷觸摸點(diǎn)是否在當(dāng)前圖層樹(shù)對(duì)象的坐標(biāo)系中用的是pointInside: withEvent:函數(shù)蝠筑,但也有一些特殊的情況,如果一個(gè)視圖正在實(shí)現(xiàn)Core Animation動(dòng)畫(huà)且動(dòng)畫(huà)過(guò)程中不允許交互(默認(rèn)不交互)什乙,那么該視圖不再調(diào)用pointInside: withEvent:函數(shù)來(lái)判斷觸摸點(diǎn)已球,而是獲取動(dòng)畫(huà)視圖的呈現(xiàn)樹(shù)對(duì)象和悦,判斷觸摸點(diǎn)是否在該呈現(xiàn)樹(shù)對(duì)象的坐標(biāo)系中渠缕。若Hit-Test View正在實(shí)現(xiàn)Core Animation動(dòng)畫(huà)且動(dòng)畫(huà)過(guò)程中不允許交互,那么本次觸摸事件將不處理且不再尋找響應(yīng)者處理事件馍忽。
? ? ? 若視圖正在實(shí)現(xiàn)Core Animation動(dòng)畫(huà)且動(dòng)畫(huà)過(guò)程中允許交互(動(dòng)畫(huà)過(guò)程中允許交互需要添加UIViewAnimationOptionAllowUserInteraction)遭笋,那么仍是調(diào)用pointInside: withEvent:函數(shù)來(lái)判斷觸摸點(diǎn)是否在當(dāng)前圖層樹(shù)對(duì)象的坐標(biāo)系中徒探,且正常地處理觸摸事件,但當(dāng)你去觸摸屏幕上正在實(shí)現(xiàn)Core Animation動(dòng)畫(huà)的視圖時(shí)测暗,就會(huì)出現(xiàn)以下情形磨澡。
? ? ? pointInside: withEvent:函數(shù)用于判斷的對(duì)象是圖層樹(shù)中的對(duì)象,而Core Animation動(dòng)畫(huà)過(guò)程中饲宿,顯示在屏幕上的是呈現(xiàn)樹(shù)的對(duì)象,而不是圖層樹(shù)的對(duì)象瘫想,但由于圖層樹(shù)對(duì)象存儲(chǔ)的是目標(biāo)值,而呈現(xiàn)樹(shù)對(duì)象存儲(chǔ)的是瞬時(shí)值霹菊,所以支竹,屏幕上實(shí)際的圖層情況如下圖。
? ? ? 所以當(dāng)你觸摸屏幕上正在實(shí)現(xiàn)Core Animation動(dòng)畫(huà)的視圖時(shí)饶碘,出現(xiàn)了圖15所展示的情形扎运,但在實(shí)際開(kāi)發(fā)當(dāng)中,我們需要的是正在實(shí)現(xiàn)Core Animation動(dòng)畫(huà)的視圖也可以響應(yīng)觸摸事件豪治,為此扯罐,我們需要對(duì)觸摸坐標(biāo)的進(jìn)行識(shí)別,通過(guò)獲取當(dāng)前觸摸點(diǎn)掩浙,判斷該點(diǎn)是否呈現(xiàn)樹(shù)對(duì)象坐標(biāo)系中秸歧。
定時(shí)動(dòng)畫(huà)
? ? ? 除了Core Animation動(dòng)畫(huà)键菱,iOS動(dòng)畫(huà)還有其它實(shí)現(xiàn)的方式,像定時(shí)動(dòng)畫(huà),手勢(shì)動(dòng)畫(huà)等险耀。定時(shí)動(dòng)畫(huà)與Core Animation動(dòng)畫(huà)不同,定時(shí)動(dòng)畫(huà)并不是基于CAAnimation來(lái)實(shí)現(xiàn)的甩牺,而是通過(guò)定時(shí)器的觸發(fā)不斷地改變圖層樹(shù)對(duì)象的UI屬性值來(lái)實(shí)現(xiàn)的累奈,每次定時(shí)觸發(fā)所改變的UI屬性都會(huì)被Application發(fā)送到渲染服務(wù)進(jìn)程,渲染服務(wù)進(jìn)程就會(huì)把最新的圖層樹(shù)渲染到屏幕上搞乏。通過(guò)定時(shí)器的觸發(fā)不斷地重復(fù)這些步驟戒努,最終在屏幕上形成了動(dòng)畫(huà)。
? ? ? 上圖顯示的就是一個(gè)簡(jiǎn)單的定時(shí)動(dòng)畫(huà)侍筛,通過(guò)一秒60幀的頻率改變圖層樹(shù)來(lái)實(shí)現(xiàn)動(dòng)畫(huà)效果撒穷。與Core Animation動(dòng)畫(huà)的觸摸響應(yīng)不同端礼,定時(shí)動(dòng)畫(huà)是通過(guò)不斷地改變圖層樹(shù)來(lái)實(shí)現(xiàn)的,屏幕上顯示的是圖層樹(shù)對(duì)象的實(shí)時(shí)值佳镜,所以實(shí)現(xiàn)定時(shí)動(dòng)畫(huà)的視圖凡桥,可以正常響應(yīng)觸摸事件而不需要做額外的處理。
? ? ? 如上圖所示望蜡,實(shí)現(xiàn)定時(shí)動(dòng)畫(huà)的視圖可以正常響應(yīng)觸摸事件拷恨。在實(shí)際開(kāi)發(fā)當(dāng)中腕侄,也許你從來(lái)沒(méi)有實(shí)現(xiàn)過(guò)定時(shí)動(dòng)畫(huà),但如果你想控制動(dòng)畫(huà)的每一幀冕杠,完全自定義動(dòng)畫(huà)的緩沖分预,那么定時(shí)動(dòng)畫(huà)是一個(gè)非常不錯(cuò)的選擇,就像ScrollView一樣配喳,ScrollView的滾動(dòng)就是一個(gè)定時(shí)動(dòng)畫(huà)凳干,正因?yàn)槿绱耍訲ableView才可以實(shí)時(shí)更新Cell的內(nèi)容并顯示出來(lái)救赐。這種實(shí)時(shí)同步圖層樹(shù)的方式经磅,既是定時(shí)動(dòng)畫(huà)的優(yōu)點(diǎn),也是定時(shí)動(dòng)畫(huà)的缺點(diǎn)馋贤,缺點(diǎn)在于一旦實(shí)時(shí)同步的操作時(shí)間過(guò)長(zhǎng)就會(huì)出現(xiàn)屏幕掉幀的情況,最常見(jiàn)的例子就是TableView在滾動(dòng)時(shí)出現(xiàn)卡屏掉幀仿滔。
? ? ? Facebook的POP動(dòng)畫(huà)引擎就是實(shí)現(xiàn)為定時(shí)動(dòng)畫(huà)崎页,所以不建議在列表中使用,會(huì)容易出現(xiàn)動(dòng)畫(huà)掉幀的情況腰埂。
Core Animation動(dòng)畫(huà)VS定時(shí)動(dòng)畫(huà)
? ? ? 不管以那種形式實(shí)現(xiàn)動(dòng)畫(huà)屿笼,動(dòng)畫(huà)都是一幀幀實(shí)現(xiàn)的,Core Animation動(dòng)畫(huà)與定時(shí)動(dòng)畫(huà)主要的不同點(diǎn)在于驴一,Core Animation動(dòng)畫(huà)是以CAAnimation對(duì)象為基礎(chǔ)的動(dòng)畫(huà)肝断,Application通過(guò)發(fā)送圖層樹(shù)和CAAnimation對(duì)象到渲染服務(wù)進(jìn)程驰凛,由渲染服務(wù)進(jìn)程完成動(dòng)畫(huà)所需要的每一幀恰响;而定時(shí)動(dòng)畫(huà)則是通過(guò)定時(shí)器的解發(fā)涌献,不斷地改變圖層樹(shù),Application把每次改變后的圖層樹(shù)發(fā)送到渲染服務(wù)進(jìn)程進(jìn)行屏幕的重新渲染间唉。
? ? ? 一般情況下呈野,Core Animation動(dòng)畫(huà)會(huì)是更好的選擇印叁,不僅是因?yàn)閷?shí)現(xiàn)Core Animation動(dòng)畫(huà)相對(duì)簡(jiǎn)單,而且動(dòng)畫(huà)的每一幀由渲染服務(wù)進(jìn)程完成昨悼,Application有更多的空間來(lái)完成其它任務(wù)率触,提高CPU的效率葱蝗;當(dāng)然细燎,你也可以使用一些物理框架來(lái)實(shí)現(xiàn)定時(shí)動(dòng)畫(huà)两曼,自定義動(dòng)畫(huà)的緩沖,實(shí)現(xiàn)更真實(shí)的效果玻驻。更多的時(shí)候是需要根據(jù)界面的情況來(lái)選擇實(shí)現(xiàn)動(dòng)畫(huà)的形式悼凑,并沒(méi)有一種形式適用于任何情況,關(guān)鍵在于如何減少掉幀璧瞬,保持界面流暢度户辫。
總結(jié)
? ? ? 在iOS端,你在屏幕上看到的一切都是由Core Animation來(lái)完成的嗤锉,當(dāng)你打算往顯示方面進(jìn)階時(shí)渔欢,你需要深入研究的是Core Animation而不是UIKit,就像Instruments里沒(méi)有UIKit測(cè)試工具一樣档冬,雖然UIKit抽象了很多Core Animation的功能膘茎,但同時(shí)也帶來(lái)了很多限制,有時(shí)候你更需要的是一些自定義效果酷誓。