參看iOS-Core-Animation-Advanced-Techniques(一)
參看CALayer與UIView的關(guān)系
參看iOS CoreAnimation專題——原理篇(一) CALayer與UIView之間的關(guān)系
UIView是iOS開發(fā)的核心類,在我們看來,它負(fù)責(zé)幾乎所有的界面展示和用戶交互,這是蘋果設(shè)計得非常好的一個地方——它完美的將其真正負(fù)責(zé)繪制界面的那個類封裝起來了,對開發(fā)者而言,我們幾乎只和UIView打交道就能完全控制一個視圖的顯示而不需要去管它底層究竟如何去處理的,然而我們今天必須要稍微深入進(jìn)UIView中看看,以便于我們之后對動畫原理的學(xué)習(xí)。
對于CALayer這個類 我相信大家都不太陌生,大多數(shù)人第一次接觸這個類都是通過一個UIView對象的屬性layer認(rèn)識的。在學(xué)習(xí)如何給一個視圖加圓角、設(shè)置邊框顏色之類的效果的時候,第一次接觸到了CALayer,當(dāng)時并沒有去理會這個東西,因為它似乎并不是UIKit框架中的東西,也不知道它有啥用,只是隱隱覺得這個家伙并不簡單,事實的確如此。
CALayer是屬于QuartzCore框架,而這個框架是一個跨平臺的繪制框架。這里的跨平臺指的是在iOS和OS X系統(tǒng)上均能使用,也就是說CALayer能在iOS和OS X上面繪制內(nèi)容 (這也說明了為什么CALayer的很多屬性都不是UIKit框架下面的東西,比如它的backgroundColor是CGColorRef,因為OS X中沒有UIKit)。但是這兩個平臺接收用戶交互的方式完全不一樣:iOS是通過觸摸事件(touch event)而OS X則是監(jiān)聽鼠標(biāo)和鍵盤事件。
蘋果的工程師們考慮到:這兩個平臺的繪制規(guī)則(如何將一個像素顯示到屏幕上)都是一樣的,但是交互規(guī)則完全不一樣。所以他們使用了同一種繪制方式和不同的交互方式,具體的,他們將CALayer作為兩個平臺共同的用來繪制內(nèi)容的類而針對交互方式,他們在iOS中使用了UIResponder類來響應(yīng)交互,在OS X中則沒有UIKit里面的類取而代之是叫做NSView之類的東西。而通常情況下交互是發(fā)生在繪制內(nèi)容之上的(有內(nèi)容的地方才能點擊),所以UIKit將CALayer封裝進(jìn)了UIView中,讓開發(fā)者們感覺到UIView既能繪制又能處理交互,而實際上負(fù)責(zé)繪制的是UIView中的CALayer。