7.4 呈現(xiàn)與模型

2018-02-24 15:07 更新

呈現(xià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ù)模型)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號