1.動畫的本質(zhì)
理論上,只要每秒鐘播放24到60張圖片,看起來這些圖片就是連續(xù)的,可以形成動畫。通常電影每秒會播放24幅圖片,iOS設(shè)備的幀率更高,運(yùn)行流暢是會保持每秒60幀的屏幕刷新率,因此,理論上,只要我們將動畫過程拆解到每一幀中,就是產(chǎn)生動畫效果。
2.CAlayer
在開發(fā)中,使用的組件幾乎都繼承UIView類,其實UIView類之所以可以將視圖繪制在屏幕上,是由期內(nèi)部分CALayer提供的支持,UIView實際上是封裝了咸寧市與交互功能的上層組件,其顯示部分是由內(nèi)部的圖層負(fù)責(zé),即CAlayer實例。
平時在使用視圖組件時,對顯示相關(guān)屬性進(jìn)行設(shè)置的時候,最終都是對圖層的設(shè)置,例如設(shè)置背景色,都是直接操做其CALayer屬性。
UIView 和 CALayer聯(lián)系和區(qū)別:http://www.itdecent.cn/p/079e5cf0f014
3.CALayer隱式動畫
所謂隱式動畫,其實是指我們可以在不設(shè)定任何動畫類型的情況下,僅僅改變CALayer的一個可做動畫的屬性,就能實現(xiàn)動畫效果。
CALayer負(fù)責(zé)UI的渲染展示,內(nèi)部也封裝了動畫的過程。CALayer內(nèi)部封裝了很多屬性默認(rèn)都是可動畫的,即只要開發(fā)這對這些屬性進(jìn)行了修改,都會產(chǎn)生動畫簡便的效果,這種技術(shù)在iOS中叫做隱式動畫。創(chuàng)建UIView實例中CALayer示例都關(guān)閉了隱式動畫功能,
默認(rèn)情況下,創(chuàng)建的UIView實例中CALayer示例都關(guān)閉了隱式動畫動能,因此修改了UIView的展示屬性后會在下一次屏幕刷新時立即改變。但是對于重新創(chuàng)建的CALayer對象,其隱式動畫功能默認(rèn)是開啟的,當(dāng)我們修改了其中可動畫的屬性時,會自動計算動畫過程中的狀態(tài)變化,并以動畫的方式進(jìn)行展示。
要理解CALayer的隱式動畫特性,首先要理解CALayer的圖層結(jié)構(gòu)和時空邏輯,圖層結(jié)構(gòu)和時空邏輯配合是iOS動畫系統(tǒng)的行為基礎(chǔ)。
圖層結(jié)構(gòu)相對比較容易理解,每一個CALayer中其實封裝了兩個平行的樹狀結(jié)構(gòu),一個是模型圖層樹,一個是表示圖層樹。模型圖層中存儲的 是圖層的屬性數(shù)據(jù),對CALayer進(jìn)行設(shè)置時,修改的就是模型層的數(shù)據(jù),修改是立即生效的,表示層最終決定圖層的渲染模樣,在動畫過程中,表示層CALayer對象中能夠的對應(yīng)屬性是不停變化的。
表示層的屬性是由系統(tǒng)進(jìn)行驅(qū)動的。
圖層的靜態(tài)狀態(tài)由模型層定義,動態(tài)的展現(xiàn)效果有表示層決定。
就是layer本身其實就是一個模型layer,只不過它擁有 presentationLayer。
在CALayer內(nèi)部也有一個瞎子和一個瘸子:presentationLayer(以下簡稱P)和modelLayer(以下簡稱M)。presentationLayer負(fù)責(zé)走路(繪制內(nèi)容),而modelLayer負(fù)責(zé)看路(如何繪制)。
P有這樣的特點(diǎn):
1、我們看到的一切,都是P的內(nèi)容;
2、P只在下次屏幕刷新時才會進(jìn)行繪制。
M有這樣的特點(diǎn):
1、我們我們對CALayer的各種繪圖屬性進(jìn)行賦值和訪問實際上都是訪問的M的屬性,比如bounds、backgroundColor、position等;
2、對這些屬性進(jìn)行賦值,不會影響P,也就是不會影響繪制內(nèi)容。你可以把M理解成一個隱身的家伙,只有P才能感知它的存在、
詳情介紹可以參考:http://www.itdecent.cn/p/d09e7929f269,https://blog.csdn.net/u013282174/article/details/50388546
4.隱式動畫的原理
問題:1.為什么隱式動畫的執(zhí)行時間默認(rèn)為0.25s?
? ? ? ? ? ? 答:隱式動畫,其實是Core Animation在每個RunLoop周期中會自動開始一次新的事務(wù),即使你不顯式的使用[CATranscation begin]開始一次事務(wù),任何在一次RunLoop運(yùn)行時循環(huán)中屬性的改變都會被集中起來,執(zhí)行默認(rèn)0.25秒的動畫。
? ? ? ? ? ? 2.系統(tǒng)是如何判定一個屬性的修改是否觸發(fā)隱式動畫?
? ? ? ? ? ? 3.為什么對UIView中能夠的屬性直接修改沒有隱式動畫產(chǎn)生?
5.各類常用的CALayer子類
CAEmitterLayer:粒子圖層,可以創(chuàng)造出粒子效果動畫
CAGradientLayer:漸變圖層,用來創(chuàng)建顏色漸變的視圖
CARepLicatorLayer:復(fù)制圖層,是一個容器圖層,放入其內(nèi)的自圖層按照一定的規(guī)則進(jìn)行復(fù)制
CAScrollerLayer:可滾動的圖層,實際內(nèi)容比現(xiàn)實內(nèi)容更大的一個圖層。
CAShapeLayer:圖形圖層,是提供給開發(fā)者進(jìn)行自定義圖層繪制的
CATextLayer:渲染文字,相對于UIview層的組件,性能更好
CATiledLayer:渲染大圖片,相對于UIview層的組件,性能更好