1.首先UIView可以響應(yīng)事件鹤啡,Layer不可以.
UIKit使用UIResponder作為響應(yīng)對(duì)象枯芬,來(lái)響應(yīng)系統(tǒng)傳遞過(guò)來(lái)的事件并進(jìn)行處理绍坝。UIApplication宵荒、UIViewController汁雷、UIView、和所有從UIView派生出來(lái)的UIKit類(包括UIWindow)都直接或間接地繼承自UIResponder類报咳。
在 UIResponder中定義了處理各種事件和事件傳遞的接口, 而 CALayer直接繼承 NSObject侠讯,并沒(méi)有相應(yīng)的處理事件的接口。
下面列舉一些處理觸摸事件的接口
– touchesBegan:withEvent:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
– touchesCancelled:withEvent:
其實(shí)還有一些運(yùn)動(dòng)和遠(yuǎn)程控制事件等等暑刃,這里就不一一列舉了厢漩。
下面的兩篇文章詳細(xì)介紹了 iOS 事件的處理和傳遞
參考鏈接:
http://blog.csdn.net/chun799/article/details/8223612
http://yishuiliunian.gitbooks.io/implementate-tableview-to-understand-ios/content/uikit/1-1-2.html
3.UIView主要是對(duì)顯示內(nèi)容的管理而 CALayer 主要側(cè)重顯示內(nèi)容的繪制。
我在 UIView 和 CALayer 分別重寫(xiě)了父類的方法岩臣。
1
2
[UIView drawRect:rect]
//UIView
[CALayer display]
//CALayer
然后我在上面兩個(gè)方法加了斷點(diǎn)溜嗜,可以看到如下的執(zhí)行。
可以看到 UIView 是 CALayer 的CALayerDelegate架谎,我猜測(cè)是在代理方法內(nèi)部[UIView(CALayerDelegate) drawLayer:inContext]調(diào)用 UIView 的 DrawRect方法炸宵,從而繪制出了 UIView 的內(nèi)容.
總結(jié)
總接來(lái)說(shuō)就是如下幾點(diǎn):
每個(gè) UIView 內(nèi)部都有一個(gè) CALayer 在背后提供內(nèi)容的繪制和顯示,并且 UIView 的尺寸樣式都由內(nèi)部的 Layer 所提供谷扣。兩者都有樹(shù)狀層級(jí)結(jié)構(gòu)土全,layer 內(nèi)部有 SubLayers,View 內(nèi)部有 SubViews.但是 Layer 比 View 多了個(gè)AnchorPoint
在 View顯示的時(shí)候抑钟,UIView 做為 Layer 的 CALayerDelegate,View 的顯示內(nèi)容由內(nèi)部的 CALayer 的 display
CALayer 是默認(rèn)修改屬性支持隱式動(dòng)畫(huà)的涯曲,在給 UIView 的 Layer 做動(dòng)畫(huà)的時(shí)候,View 作為 Layer 的代理在塔,Layer 通過(guò) actionForLayer:forKey:向 View請(qǐng)求相應(yīng)的 action(動(dòng)畫(huà)行為)
layer 內(nèi)部維護(hù)著三分 layer tree,分別是 presentLayer Tree(動(dòng)畫(huà)樹(shù)),modeLayer Tree(模型樹(shù)), Render Tree (渲染樹(shù)),在做 iOS動(dòng)畫(huà)的時(shí)候幻件,我們修改動(dòng)畫(huà)的屬性,在動(dòng)畫(huà)的其實(shí)是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實(shí)是提供 View的modelLayer
兩者最明顯的區(qū)別是 View可以接受并處理事件蛔溃,而 Layer 不可以