1.CALayer 與 UIView 的區(qū)別:
它們有一些方法和屬性用來(lái)做動(dòng)畫(huà)和變換。和UIView最大的不同是CALayer不處理用戶(hù)的交互。
CALayer并不清楚具體的響應(yīng)鏈(iOS通過(guò)視圖層級(jí)關(guān)系用來(lái)傳送觸摸事件的機(jī)制),于是它并不能夠響應(yīng)事件蝎困,即使它提供了一些方法來(lái)判斷是否一個(gè)觸點(diǎn)在圖層的范圍之內(nèi)
除了視圖層級(jí)和圖層樹(shù)之外,還存在呈現(xiàn)樹(shù)和渲染樹(shù)
我們已經(jīng)證實(shí)了圖層不能像視圖那樣處理觸摸事件,那么他能做哪些視圖不能做的呢墓阀?這里有一些UIView沒(méi)有暴露出來(lái)的CALayer的功能:
陰影,圓角拓轻,帶顏色的邊框
3D變換
非矩形范圍
透明遮罩
多級(jí)非線性動(dòng)畫(huà)
一個(gè)視圖(UIView)只有一個(gè)相關(guān)聯(lián)的圖層(layer)(自動(dòng)創(chuàng)建)斯撮,同時(shí)它也可以支持添加無(wú)數(shù)多個(gè)子圖層
2.CALayer 的 寄宿圖
CALayer類(lèi)能夠包含一張你喜歡的圖片,這一章節(jié)我們將來(lái)探索CALayer的寄宿圖(即圖層中包含的圖)
contents屬性:
在實(shí)踐中扶叉,如果你給contents賦的不是CGImage勿锅,那么你得到的圖層將是空白的.
事實(shí)上,你真正要賦值的類(lèi)型應(yīng)該是CGImageRef枣氧,它是一個(gè)指向CGImage結(jié)構(gòu)的指針溢十。UIImage有一個(gè)CGImage屬性,它返回一個(gè)"CGImageRef",如果你想把這個(gè)值直接賦值給CALayer的contents达吞,那你將會(huì)得到一個(gè)編譯錯(cuò)誤张弛。因?yàn)镃GImageRef并不是一個(gè)真正的Cocoa對(duì)象,而是一個(gè)Core Foundation類(lèi)型。
盡管Core Foundation類(lèi)型跟Cocoa對(duì)象在運(yùn)行時(shí)貌似很像(被稱(chēng)作toll-free bridging)乌庶,他們并不是類(lèi)型兼容的种蝶,不過(guò)你可以通過(guò)bridged關(guān)鍵字轉(zhuǎn)換。如果要給圖層的寄宿圖賦值瞒大,你可以按照以下這個(gè)方法:
layer.contents = (__bridge id)image.CGImage;
.
注意:Core Foundation類(lèi)型與Cocoa對(duì)象運(yùn)行時(shí)很像螃征,但是不一樣,可以通過(guò)(__bridge id)方法來(lái)轉(zhuǎn)換
contentsRect在app中最有趣的地方在于一個(gè)叫做image sprites(圖片拼合)的用法透敌。
利用Interface Builder探測(cè)窗口 的 Stretching控制contentsCenter屬性
雖然-drawRect:方法是一個(gè)UIView方法盯滚,事實(shí)上都是底層的CALayer安排了重繪工作和保存了因此產(chǎn)生的圖片。
3.圖層幾何學(xué)
UIView有三個(gè)比較重要的布局屬性:frame酗电,bounds和center魄藕,CALayer對(duì)應(yīng)地叫做frame,bounds和position撵术。為了能清楚區(qū)分背率,圖層用了“position”,視圖用了“center”嫩与,但是他們都代表同樣的值寝姿。
對(duì)于視圖或者圖層來(lái)說(shuō),frame并不是一個(gè)非常清晰的屬性划滋,它其實(shí)是一個(gè)虛擬屬性饵筑,是根據(jù)bounds,position和transform計(jì)算而來(lái)处坪,所以當(dāng)其中任何一個(gè)值發(fā)生改變根资,frame都會(huì)變化。相反同窘,改變frame的值同樣會(huì)影響到他們當(dāng)中的值
hitTest:方法同樣接受一個(gè)CGPoint類(lèi)型參數(shù)玄帕,而不是BOOL類(lèi)型,它返回圖層本身塞椎,或者包含這個(gè)坐標(biāo)點(diǎn)的葉子節(jié)點(diǎn)圖層桨仿。
4.coreAnimation并不是一個(gè)繪圖系統(tǒng)。它只是一個(gè)負(fù)責(zé)在硬件上合成和操縱應(yīng)用內(nèi)容的基礎(chǔ)構(gòu)件案狠。
CoreAnimation核心是圖層對(duì)象服傍,圖層對(duì)象用于管理和操控你的應(yīng)用內(nèi)容。
圖層將捕獲的內(nèi)容放到一副位圖中骂铁,圖形硬件能夠非常容易的操控你的位圖吹零。
圖層被作為一種管理視圖內(nèi)容的方式,但是你也可以創(chuàng)建標(biāo)準(zhǔn)的圖層拉庵,這取決于你自身的需要灿椅。
動(dòng)畫(huà)分為:隱式動(dòng)畫(huà)和顯示動(dòng)畫(huà)
隱式動(dòng)畫(huà)是一種從舊屬性值動(dòng)畫(huà)到新屬性值的動(dòng)畫(huà)形式。
******基于圖層的繪圖模型******
對(duì)基于視圖的繪圖,對(duì)視圖的改變經(jīng)常會(huì)觸發(fā)調(diào)用視圖的drawRect:方法以重繪視圖內(nèi)容茫蛹。但是此種方式的代價(jià)相對(duì)較高操刀,因?yàn)樗?strong>CPU在主線程上的操作。Core Animation通過(guò)盡可能的使用圖形硬件操縱緩存后的位圖來(lái)避免了這種開(kāi)銷(xiāo)婴洼,從而完成相同或相似的效果骨坑。
****基于圖層的動(dòng)畫(huà)****
可在圖層上執(zhí)行的動(dòng)畫(huà)類(lèi)型:移動(dòng),縮放柬采,旋轉(zhuǎn)欢唾,透明度,圓角半徑粉捻,背景顏色礁遣。
圖層對(duì)象定義了自己的幾何結(jié)構(gòu)
****圖層使用兩種類(lèi)型的坐標(biāo)系統(tǒng)****
圖層利用基于點(diǎn)的坐標(biāo)系統(tǒng)和單位坐標(biāo)系統(tǒng)指定內(nèi)容的布局,當(dāng)指定的值是直接映射到屏幕或相對(duì)于其他圖層的坐標(biāo)肩刃,圖層的position屬性,則使用基于點(diǎn)的坐標(biāo)系統(tǒng)祟霍,與屏幕坐標(biāo)不相關(guān)聯(lián),則使用單位坐標(biāo)树酪。比如圖層的anchorPoint屬性浅碾。
錨點(diǎn)是使用單位坐標(biāo)系統(tǒng)的屬性之一。
錨點(diǎn)影響幾何結(jié)構(gòu)的操作
position屬性是相對(duì)于圖層的錨點(diǎn)被指定续语。并且任何你對(duì)圖層陰影的變換操作也是相對(duì)于錨點(diǎn)。
AnchorPoint相對(duì)于自身wh的百分比厦画,0.0~1.0疮茄,position是相對(duì)于父視圖的坐標(biāo)點(diǎn)。
5.CoreAnimation
作用不僅僅是做動(dòng)畫(huà)根暑。
在iOS端力试,我們看到的一切都是由Core Animation來(lái)完成的。
但Core Animation并不做實(shí)際的繪制渲染的工作排嫌,實(shí)際的繪制渲染工作由繪制渲染系統(tǒng)(GPU)來(lái)完成畸裳,Core Animation是一個(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并不依賴(lài)于Core Animation。由于Core Animation在iOS端的位置劝评,所以你如何使用Core Animation這將會(huì)對(duì)性能產(chǎn)生極大的影響姐直。
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等。
// 隱式動(dòng)畫(huà)
var layer = CALayer.init()
layer.backgroundColor = UIColor.black.cgColor
// 顯示動(dòng)畫(huà)
var animation = CABasicAnimation.init(keyPath: "backgroundColor") // 顯示創(chuàng)建CAAnimation對(duì)象
animation.fromValue = layer.backgroundColor
animation.toValue = UIColor.black.cgColor
layer.backgroundColor = UIColor.black.cgColor
layer.add(animation, forKey: nil)
對(duì)于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 begin];
// do something
[CATransation commit];
這個(gè)上面為CATransation的顯示創(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ì)象募强。
6.UIKit動(dòng)畫(huà)
UIKit動(dòng)畫(huà)和Core Animation動(dòng)畫(huà)是相關(guān)連的,它們的關(guān)系就好像NSOperation和GCD一樣崇摄,UIKit動(dòng)畫(huà)是建立在Core Animation動(dòng)畫(huà)之上的擎值。
UIView對(duì)象的Backing Layer的隱式動(dòng)畫(huà)是默認(rèn)關(guān)閉的,如果想開(kāi)啟需要使用UIKit的事務(wù)逐抑。
// 開(kāi)啟UIKit隱身動(dòng)畫(huà)
// 方式1
UIView.beginAnimations(nil, context: nil)
// do something
UIView.commitAnimations()
// 方式2
UIView.animate(withDuration: 0.25) {
// do something
}
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è)抽象物,能提供的效果還是很有限的玄括。
7.Core Animation動(dòng)畫(huà)與觸摸響應(yīng)
當(dāng)我們觸摸屏幕時(shí)冯丙,系統(tǒng)就會(huì)把這個(gè)觸摸事件傳遞給相應(yīng)Application,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)者的基類(lèi)斯嚎,響應(yīng)者的類(lèi)型不是唯一的利虫,不同的系統(tǒng)事件對(duì)應(yīng)著不同類(lèi)型的響應(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。
一個(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ò)重寫(xiě)一些函數(shù)使事件繼續(xù)傳遞)冀膝。
即使不發(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而不是父視圖疙描。
正常情況下诚隙,判斷觸摸點(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)系中。
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í)值否彩。
呈現(xiàn)樹(shù):Presentation Layer
圖層樹(shù):Model Layer
8.定時(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à)盯质。
就是通過(guò)timer不斷刷新view的frame
如果你想控制動(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)卡屏掉幀集惋。(原理:定時(shí)動(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)鍵在于如何減少掉幀痘绎,保持界面流暢度。
一般情況下肖粮,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í)候你更需要的是一些自定義效果迷殿。