1.UIWindow概述
- UIWindow是一种特殊的UIView,通常在一个app中只有一个UIWindow
- IOS程序启动完毕后,创建的第一个视图控件就是UIWidnow,接着创建控制器的View,最后将控制器的View添加到UIWindow,于是控制器的View就显示上在屏幕上了
- 一个IOS程序之所以能够显示在屏幕上,就是因为有UIWindow
- 也就是说没有UIWindow,就看不见任何界面
2.通过查询Xcode文档
3.UIWindow创建过程
- 要想利用代码重现UIWindow的创建过程,需先将指定从Storyboard加载设置去掉
Storyboard加载设置去掉图片 - 代码重现UIWindow的加载,需在AppDelegate类中实现
// 程序启动完成后调用此方法
// 加载完info.plist文件后程序才算启动完毕
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.窗口要想显示,必须强引用,必须设置frame
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.设置窗口的根控制器
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor orangeColor];
// 设置窗口的根控制器,底层会自动将控制器的View添加到Window上,并且让控制器的View具有旋转功能
self.window.rootViewController = vc;
/*
// 若是不设置根控制器,仅仅将控制器的View添加到窗口上
[self.window addSubview:vc.view];
// 会导致如下问题
1.当view上发生一些事件的时候,通知控制器,但控制器可能被销毁了,可能出现一些未知的错误
2.当发生旋转事件的时候,UIApplication会将旋转事件传递给UIWindow,UIWindow又将旋转事件传递给它的根控制器,由根控制器决定是否需要旋转
*/
// 3.设置窗口为程序的主窗口并显示在屏幕上
[self.window makeKeyAndVisible];
// 系统底层先将窗口设置为应用程序的主窗口,并且将window的hidden属性设置为NO
// application.keyWindow = self.window;
// self.window.hidden = NO;
return YES;
}
4.IOS应用程序启动完整过程总结
- 1.main函数
- 2.UIApplicationMain函数
- 创建UIApplication对象
- 创建UIApplication的代理对象(代理实现UIApplicationDelegate协议),并设置为UIApplication的代理
- 3.开启主运行循环,代理对象开始监听处理系统事件(没有storyboard情况)
- 程序启动完毕的时候,就会调用代理方法- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions
- 在该方法中创建UIWindow
- 创建并设置UIWindow的根控制器rootViewController
- 显示窗口
- 3.根据info.plist获得最主要的storyboard的文件名,并加载storyboard(有storyboard)
- 创建UIWindow
- 创建并设置UIWindow的根控制器rootViewController
- 显示窗口
5.UIWindow优先级说明
// 应用程序中还有哪些是UIWindow,状态栏、键盘
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.创建UIWindow
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 1.1设置窗口的背景颜色
self.window.backgroundColor = [UIColor yellowColor];
// 1.2设置窗口的层级
/* 窗口层级为CGFloat 常量
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; 0
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; 2000
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar; 1000
*/
self.window.windowLevel = UIWindowLevelStatusBar;
// 1.3显示窗口
[self.window makeKeyAndVisible];
// 1.4添加弹出键盘文本框
UITextField *textfield = [[UITextField alloc] init];
[textfield becomeFirstResponder];
[self.window addSubview:textfield];
// 窗口的层级的级别 UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal,谁大就谁显示在最外面
// 2.创建窗口1
self.window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 300, 300, 300)];
// 2.1.设置窗口1的背景颜色
self.window1.backgroundColor = [UIColor blueColor];
// 2.2显示窗口1
[self.window1 makeKeyAndVisible];
// 2.3设置窗口1的优先级
self.window1.windowLevel = UIWindowLevelAlert;
return YES;
}
// 结果是window1显示在最外面,键盘在window之上,window在最下面