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