UIWindow
UIWindow是一种特殊的UIView,通常在一个app中至少会有一个UIWindow
iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow
也就说,没有UIWindow,就看不见任何UI界面
UIWindow是一种特殊的UIView,通常在一个app中至少会有一个UIWindow
iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow
也就说,没有UIWindow,就看不见任何UI界面
系统创建原理
- 创建窗口
- 加载Main.storyboard,并且创建storyboard描述的控制器
- 把storyboard描述的控制器作为窗口的根控制器
- 显示窗口
代码创建
1.什么时候创建?
1.在加载info.plist文件之后,程序启动才完成,启动完成之后,就要显示窗口,因此在程序启动完成的时候创建窗口.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 窗口显示的注意点:
// 1.一定要强引用
// 2.控件要想显示出来,必须要有尺寸
// 1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.创建根控制器,在设置窗口的根控制器
UIViewController *vc = [[UIViewController alloc] init];
// 设置窗口的根控制器,底层会自动把根控制器的view添加到窗口上,并且让控制器的view有旋转功能
self.window.rootViewController = vc;
// 3.显示窗口
// makeKeyAndVisible:让窗口成为应用程序的主窗口,并且显示窗口
[self.window makeKeyAndVisible];
return YES;
}
storyboard创建
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// [NSBundle mainBundle] loadNibNamed:<#(NSString *)#> owner:<#(id)#> options:<#(NSDictionary *)#>
// 1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.加载main.storyboard,创建main.storyboard描述的控制器
// UIStoryboard专门用来加载stroyboard
// name:storyboard名称不需要后缀
// bundle:主bundle,传入nil,表示主bundle
UIStoryboard *stroyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
// 加载sotryboard描述的控制器
// 加载箭头指向的控制器
UIViewController *vc = [stroyboard instantiateInitialViewController];
// 根据标识符创建storyboard描述的控制器
// UIViewController *vc = [stroyboard instantiateViewControllerWithIdentifier:@"blue"];
// 设置窗口的根控制器
self.window.rootViewController = vc;
// 3.显示窗口
[self.window makeKeyAndVisible];
return YES;
}
xib创建
// xib加载控制器的步骤
// xib必须要有view去描述控制器
// 告诉xib中哪个view描述控制器view,如何告诉,就必须连线
// 让xib和控制器产生联系,告诉xib是用来描述一个控制器,设置Xib的File'owner为控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// 1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 为什么通过xib或者storyboard创建控制器,其实就是想搞一个view来描述控制器的view
// 创建窗口的根控制器
// 通过xib创建控制器
ViewController *vc = [[ViewController alloc] initWithNibName:@"VC" bundle:nil];
// 设置窗口的根控制器
self.window.rootViewController = vc;
// 3.显示窗口
[self.window makeKeyAndVisible];
return YES;
}
2.窗口层级关系 UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal
设置窗口的层级,层级谁大就显示在最外面
3.UITextField显示键盘
注意点:如果一个键盘想要弹出来,必须把textField添加到一个控件上.
扩展
makeKeyAndVisible方法的实现
- 显示窗口并且成为主窗口
- 可以显示窗口 self.window.hidden = NO;
- 成为应用程序的主窗口 application.keyWindow = self.window;