您的位置:首页 > 产品设计 > UI/UE

【iOS开发】UIWindow和程序启动原理

2015-03-31 01:13 429 查看
一、UIWindow
0、为什么要有UIWindow?
(1)首先理解几个对象的作用
*UIScreen :连接物理设备屏幕
*UIWindow:为UIScreen提供绘画支持,view要显示出来,必须要通过window提供的屏幕绘画支持,否则无法显示。除非该APP可以连接到其他设备上显示。
*UIView:很多view也有绘画功能,但是需要绘制好的图层copy到window上,才能显示在设备屏幕。
(2)所以说,没有window,view就不能显示。

1、创建出来的窗口必须设置大小尺寸才能显示,避免被销毁;一个应用程序只能有一个主窗口

2、窗口window
(1)常见的窗口:键盘,UIActionSheet,UIAlertView等都会交给UIApplication.Window的处理
(2)特殊窗口:状态栏,不会交给UIApplication管理,ios7之后交给控制器管理

3、窗口的层级(很多窗口情况下)
(1)层级: UIWindowLevelNormal<UIWindowLevelStatusBar<UIWindowLevelAlert
(2)窗口默认都是UIWindowLevelNormal
(3)键盘永远是最高层级的,在显示之前会获得当前所处的层级,然后+1

4、窗口显示底层实现
(1)为什么窗口要设置根控制器,而不能直接把子控件添加到window上
 *没有根控制器,窗口上的子控件不能旋转
 *让代码结构更清晰合理,不会把所有代码写在UIApplidelegate中

(2)设置 窗口rootViewController的底层实现:
          第一步:让窗口可以旋转
          第二步:将根控制器的View添加到窗口上

5、makeKeyAndVisible底层实现:
 1.成为application的主窗口application.keyWindow
= self.window;
 2.让窗口显示出来self.window.hidden = NO;(默认是NO)
 3.把窗口根控制器的view添加到窗口上[self.window
addSubview:window.rootViewController.view];

二、程序启动原理
1、main函数 —》执行UIApplicationMain方法:
(1)创建UIApplication对象
(2)创建APPDelegate对象,并给application对象的delegate属性赋值为APPDelegate;
(3)创建主运行循环(死循环),避免程序一启动就退出
(4)加载info.plist文件,读取配置信息,判断有没有指定main.storyboard为程序根控制器,如果有,就加载main.storyboard中的控制器。
(5)main.storyboard底层操作:
   1》创建UIWindow对象
   2》创建storyboard中的控制器
   3》把storyboard中的控制器最为窗口的跟控制器,并让窗口显示
   4》加载main.storyboard的底层实现
 


(6)如果没有指定main.storyboard,那么需要在APPDelegate中创建窗口,并自定义控制器最为窗口的根控制器,并让窗口显示在屏幕上

2、通过storyboard来创建控制器 (参照storyboard的底层实现)
(1)先创建一个storyboard
(2)在storyboard中绑定该控制器,然后使用该storyboard来实例化一个控制器(利用了反射原理)

3、程序启动原理想详解图



 
        【by:Leo_zzp,支持原创,转载请说明出处!】
                           个人邮箱:15999745308@163.com,GitHub链接:MrLeoZou,期待您的交流!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: