iOS 動(dòng)畫(huà)基礎(chǔ)知識(shí)

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ì)于UIViewBacking 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檀轨?這是由于CATransactionNSAutoreleasePool一樣胸竞,也分為隱式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í)候你更需要的是一些自定義效果迷殿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儿礼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庆寺,更是在濱河造成了極大的恐慌蚊夫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懦尝,死亡現(xiàn)場(chǎng)離奇詭異知纷,居然都是意外死亡壤圃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)琅轧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伍绳,“玉大人,你說(shuō)我怎么就攤上這事乍桂〕迳保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵模蜡,是天一觀的道長(zhǎng)漠趁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)忍疾,這世上最難降的妖魔是什么闯传? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮卤妒,結(jié)果婚禮上甥绿,老公的妹妹穿的比我還像新娘。我一直安慰自己则披,他們只是感情好共缕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著士复,像睡著了一般图谷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阱洪,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天便贵,我揣著相機(jī)與錄音,去河邊找鬼冗荸。 笑死承璃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚌本。 我是一名探鬼主播盔粹,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼程癌!你這毒婦竟也來(lái)了舷嗡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嵌莉,失蹤者是張志新(化名)和其女友劉穎咬崔,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垮斯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了只祠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兜蠕。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖抛寝,靈堂內(nèi)的尸體忽然破棺而出熊杨,到底是詐尸還是另有隱情,我是刑警寧澤盗舰,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布晶府,位于F島的核電站,受9級(jí)特大地震影響钻趋,放射性物質(zhì)發(fā)生泄漏川陆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一蛮位、第九天 我趴在偏房一處隱蔽的房頂上張望较沪。 院中可真熱鬧,春花似錦失仁、人聲如沸尸曼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)控轿。三九已至,卻和暖如春拂封,著一層夾襖步出監(jiān)牢的瞬間茬射,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工烘苹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躲株,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓镣衡,卻偏偏與公主長(zhǎng)得像霜定,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子廊鸥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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