UIWindow
标签(空格分隔): UI
UIWindow的显示
- 创建窗口(程序自动创建窗口)
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor redColor];
- 加载Main.storyboard,并且创建storyboard描述的控制器
UIViewController *rootVc = [[UIViewController alloc] init];
- 把storyboard描述的控制器作为窗口的根控制器
self.window.rootViewController = rootVc;
- 显示窗口(在程序启动完成的时候,仅仅只是帮你创建好窗口,并不会马上显示。)
- 窗口要显示出来必须的步骤
- 1.强引用窗口
- 2.设置窗口的尺寸
[self.window makeKeyAndVisible];
窗口的层级
self.window.windowLevel = 1000;
- 窗口的显示看窗口的层级高低
- 相同层级的窗口,后创建的显示
通过storyboard手动加载控制器
- 先把项目的Main Interface清空
/**
* 应用程序加载完成的时候调用
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 从storyboard加载控制器
UIStoryboard *sto = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
// 创建控制器
UIViewController *rootVc = [sto instantiateInitialViewController];
UIViewController *contr = [sto instantiateViewControllerWithIdentifier:@"VC"];
self.window.rootViewController = contr;
// 显示窗口
[self.window makeKeyAndVisible];
return YES;
}
通过Xib创建控制器
- 先把项目的Main Interface清空
- 新建Xib文件
- 在Xib文件中拖一个UIView
- 修改
File's Owner
的class为控制器的类名 - 需要把Xib上的View与控制器连线
// 创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 通过Xib创建控制器
UIViewController *rootVc = [[UIViewController alloc] initWithNibName:@"VC" bundle:nil];
self.window.rootViewController = rootVc;
// 显示窗口
[self.window makeKeyAndVisible];
控制器的View
假设通过Xib创建XMGViewController控制器对象
- 如果nibName为nil,首先会去查找
XMGView.xib
,如果有,就会去加载XMGView.xib描述的控制器的view - 如果没有找到,就会去找
XMGViewController.xib
,如果有,也会去加载 - 都没有找到,就会
生成一个空的view
- 如果nibName为nil,首先会去查找
只要没有重写
loadView
,系统就会自动判断有没有storyboard或者xib描述控制器的View,如果有就会去加载它们描述控制器的view
生成的默认的空View,默认几乎透明(alpha = 0.01)
如果一个VIew完全透明,可以直接穿透,点击后面的东西
如果当前控制器是窗口的根控制器,可以不设置尺寸
打印控制器的View的真实尺寸,一般不会在viewDidLoad方法中打印,因为不准确
// 在这个方法中打印View的真实尺寸
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"%@",NSStringFromCGRect(self.view.frame));
}
控制器的view是延迟加载的:用到时再加载
可以用
isViewLoaded
方法判断一个UIViewController的view是否已经被加载控制器的view加载完毕就会调用viewDidLoad方法