IOS开发概述-08.UIWindow
2015-07-28 21:11
399 查看
1.UIWindow概述
UIWindow是一种特殊的UIView,通常在一个app中只有一个UIWindowIOS程序启动完毕后,创建的第一个视图控件就是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在最下面
相关文章推荐
- Equivalent Strings
- iOS 8中使用UIAlertController
- Android基础UI之创建新视图
- hdu 5301 Buildings
- OC--迭代器/NSNumber/NSValue/NSRange/NSSet/NSDate 及相互转化
- Windows Message Queue
- HDU 1159 Common Subsequence 公共子序列
- iOS学习(frame、bounds、center:)以及UIView的旋转,平移和缩放
- hdu 5288 OO’s Sequence(two point + rmq)
- UI__UIGestureRecognize
- Snail—UI学习之代理传值Delegate
- 获取进程CPU占用率 -- NtQuerySystemInformation
- 暴力求解——Equivalent Strings
- How to convert Windows 7 on MBR/BIOS to GPT/UEFI
- ANDROID STDUIO 项目里的R文件突然丢失的解决办法N种之一
- UVA120istringstream和deque的用法
- IOS--UI--LessonFMDB
- iOS UILabel的输出自适应高度设置
- 终于搞定UIScrollView上的几个tableview和collection view之间切换的问题了
- Error building Player: CommandInvokationFailure: Unable to convert classes into dex format. See the