W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
CALayer
的屬性行為其實(shí)很不正常,因?yàn)楦淖円粋€圖層的屬性并沒有立刻生效,而是通過一段時間漸變更新。這是怎么做到的呢?
當(dāng)你改變一個圖層的屬性,屬性值的確是立刻更新的(如果你讀取它的數(shù)據(jù),你會發(fā)現(xiàn)它的值在你設(shè)置它的那一刻就已經(jīng)生效了),但是屏幕上并沒有馬上發(fā)生改變。這是因?yàn)槟阍O(shè)置的屬性并沒有直接調(diào)整圖層的外觀,相反,他只是定義了圖層動畫結(jié)束之后將要變化的外觀。
當(dāng)設(shè)置CALayer
的屬性,實(shí)際上是在定義當(dāng)前事務(wù)結(jié)束之后圖層如何顯示的模型。Core Animation扮演了一個控制器的角色,并且負(fù)責(zé)根據(jù)圖層行為和事務(wù)設(shè)置去不斷更新視圖的這些屬性在屏幕上的狀態(tài)。
我們討論的就是一個典型的微型MVC模式。CALayer
是一個連接用戶界面(就是MVC中的view)虛構(gòu)的類,但是在界面本身這個場景下,CALayer
的行為更像是存儲了視圖如何顯示和動畫的數(shù)據(jù)模型。實(shí)際上,在蘋果自己的文檔中,圖層樹通常都是值的圖層樹模型。
在iOS中,屏幕每秒鐘重繪60次。如果動畫時長比60分之一秒要長,Core Animation就需要在設(shè)置一次新值和新值生效之間,對屏幕上的圖層進(jìn)行重新組織。這意味著CALayer
除了“真實(shí)”值(就是你設(shè)置的值)之外,必須要知道當(dāng)前顯示在屏幕上的屬性值的記錄。
每個圖層屬性的顯示值都被存儲在一個叫做呈現(xiàn)圖層的獨(dú)立圖層當(dāng)中,他可以通過-presentationLayer
方法來訪問。這個呈現(xiàn)圖層實(shí)際上是模型圖層的復(fù)制,但是它的屬性值代表了在任何指定時刻當(dāng)前外觀效果。換句話說,你可以通過呈現(xiàn)圖層的值來獲取當(dāng)前屏幕上真正顯示出來的值(圖7.4)。
我們在第一章中提到除了圖層樹,另外還有呈現(xiàn)樹。呈現(xiàn)樹通過圖層樹中所有圖層的呈現(xiàn)圖層所形成。注意呈現(xiàn)圖層僅僅當(dāng)圖層首次被提交(就是首次第一次在屏幕上顯示)的時候創(chuàng)建,所以在那之前調(diào)用-presentationLayer
將會返回nil
。
你可能注意到有一個叫做–modelLayer
的方法。在呈現(xiàn)圖層上調(diào)用–modelLayer
將會返回它正在呈現(xiàn)所依賴的CALayer
。通常在一個圖層上調(diào)用-modelLayer
會返回–self
(實(shí)際上我們已經(jīng)創(chuàng)建的原始圖層就是一種數(shù)據(jù)模型)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: