1. UIWindow
@interface UIWindow : UIView
@property(nonatomic) UIWindowLevel windowLevel; // default = 0.0
@property(nonatomic,readonly,getter=isKeyWindow) BOOL keyWindow;
- (void)becomeKeyWindow; // override point for subclass. Do not call directly
- (void)resignKeyWindow; // override point for subclass. Do not call directly
- (void)makeKeyWindow;
- (void)makeKeyAndVisible; // convenience. most apps call this to show the main window and also make it key. otherwise use view hidden property
@property(nullable, nonatomic,strong) UIViewController *rootViewController NS_AVAILABLE_IOS(4_0); // default is nil
@end
繼承自UIView,是一種特殊的 UIView,通常在一個app中只會有一個keyUIWindow。
iOS程序啟動完畢后,創(chuàng)建的第一個視圖控件就是UIWindow,接著創(chuàng)建控制器的view,最后將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了
主要作用是提供一個區(qū)域用來顯示UIView;將事件分發(fā)給UIView;與UIViewController一起處理屏幕的旋轉(zhuǎn)事件。
2. UIView
@interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, UIFocusItemContainer, CALayerDelegate>
@property(nonatomic,readonly,strong) CALayer *layer;
@end
@interface UIResponder : NSObject <UIResponderStandardEditActions>
繼承自UIResponder,間接繼承自NSObject,主要是用來構建用戶界面的,并且可以響應事件。
對于UIView,側(cè)重于對內(nèi)容的顯示管理;其實是相對于CALayer的高層封裝。
3. CALayer
@interface CALayer : NSObject <NSSecureCoding, CAMediaTiming>
直接繼承自NSObject,所以不能響應事件
其實就是一個圖層,UIView之所以能顯示在屏幕上,主要是它內(nèi)部有一個CALayer對象。在創(chuàng)建UIView時,它內(nèi)部會自動創(chuàng)建一個圖層,當UIView需要顯示在屏幕上的時候,會調(diào)用drawRect:方法進行繪圖,并且會將所有內(nèi)容繪制到自己的圖層上,繪圖完畢后,系統(tǒng)會將圖層拷貝到屏幕上,這樣完成UIView的顯示。

- layer給view提供了基礎設施,使得繪制內(nèi)容和呈現(xiàn)更高效動畫更容易、更低耗
- layer不參與view的事件處理、不參與響應鏈
更多:iOS面試題合集