一、UIView和CALayer都是源自NSObject。
1、UIView的繼承結構為:UIResponder:NSObject。可以看出UIView的直接父類為UIResponder類。可見UIResponder是用來響應事件的,也就是說UIView可以響應用戶事件。
2、CALayer的繼承結構:NSObject ? :直接從NSObject繼承,因為缺少了UIResponder類,所以CALayer不能響應任何的用戶事件。
二、它們分別所屬的框架不同
1、UIView是在/System/Library/Frameworks/UIKit.framework中定義的。屬于UIkit.framework框架,負責渲染矩形區域的內容,為矩形區域添加動畫,響應區域的觸摸事件,布局,和管理一個或多個子視圖 。
2、CALayer是在/System/Library/Frameworks/QuartzCore.framework定義的。而且CALayer作為一個低級的可以承載繪制內容的底層對象出現在該框架中。
3、UIWindow:屬于UIKit.framework框架,是一種特殊的UIView,通常在一個程序中只會有一個UIWindow,但可以手動創建多個UIWindow,同時加到程序里面。
注:
UIWindow在程序中主要起到三個作用:(1)作為容器,包含App程序所要顯示的所有視圖
(2)傳遞觸摸消息到其他的UIView和其他對象
(3)與UIViewController協同工作,方便完成設備方向旋轉的支持
? ? ? ? ?綜上來看UIView與CALayer的最大區別在于UIView可以響應用戶事件,而CALayer不可以。UIView側重于對顯示內容的管理,CALayer側重于對內容的繪制。由此可見UIView確實是CALayer 的高級封裝。
三、為什么是兩套體系?
? ? ? ? ? ? 并不是兩套體系,UIView和CALayer是相互依賴的關系。UIView依賴與calayer提供的內容,CALayer依賴uivew提供的容器來顯示繪制的內容。歸根到底CALayer是這一切的基礎,如果沒有CALayer,UIView自身也不會存在,UIView是一個特殊的CALayer實現,添加了響應事件的能力。UIView本身,更像是一個CALayer的管理器,訪問它的跟繪圖和跟坐標有關的屬性,例如frame,bounds等等,實際上內部都是在訪問它所包含的CALayer的相關屬性。
四、UIwindow是UIView的子類
? ? ? ?UIwindow是UIView的子類,UIWindow的主要作用:一是提供一個區域來顯示UIView,二是將事件(event)的分發給UIView,一個應用基本上只有一個UIWindow.iOS程序啟動完畢后,創建的第一個視圖控件就是UIWindow,接著創建控制器的view,最后將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了。一個iOS程序之所以能顯示到屏幕上,完全是因為它有UIWindow。即沒有UIWindow,就看不見任何UI界面。