walker代理深入浅出——程序的启动原理(下)(探究 UIWindow)

上一节主要讲解了程序的启动原理UIApplication 的启动,以及 main 函数的执行,现在主要讲解界面的加载以及执行部分。

UIWindow

下面先看看Apple的官方文档

Apple官方文档

UIWindow继承自UIView,UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面。即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件(即主窗口)。

iOS程序启动完毕后,先创建Application,再创建它的代理,之后创建UIWindow(创建的第一个对象是UIApplication),接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了。

一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow。也就说,没有UIWindow,就看不见任何UI界面。

主窗口和次窗口

【self.window makekeyandvisible】让窗口成为主窗口,并且显示出来。有这个方法,才能把信息显示到屏幕上。

因为Window有makekeyandvisible这个方法,可以让这个Window凭空的显示出来,而其他的view没有这个方法,所以它只能依赖于Window,Window显示出来后,view才依附在Window上显示出来。

【self.window make keywindow】//让uiwindow成为主窗口,但不显示。

次窗口,需要定义一个Window属性来保存变量。 window的属性定义为strong,就是为了让其不销毁, 一个应用程序只能有一个主窗口。只有主窗口才能响应键盘的输入事件,如果不能输入内容,可以查看是否是显示在主窗口上,不在主窗口上的不能响应。

WindowLevel

UIWindow有三个层级,分别是Normal,StatusBar,Alert。Normal级别是最低的,StatusBar处于中等水平,Alert级别最高。而通常我们的程序的界面都是处于Normal这个级别上的,系统顶部的状态栏应该是处于StatusBar级别,UIActionSheet和UIAlertView这些通常都是用来中断正常流程,提醒用户等操作,因此位于Alert级别。

根据window显示级别优先的原则,级别高的会显示在上面,级别低的在下面,我们程序正常显示的view位于最底层。

当Level层级相同的时候,只有第一个设置为KeyWindow的显示出来,后面同级的再设置KeyWindow也不会显示。UIWindow在显示的时候是不管KeyWindow是谁,都是Level优先的,即Level最高的始终显示在最前面。

UIWindow是显示的起点

1.UIWindow对象是所有UIView的根,管理和协调应用程序的显示。
2.UIViewController对象负责管理所有UIView的层次结构,并响应设备的方向变化。
3.UIView对象定义了一个屏幕上的一个矩形区域,同时处理该区域的绘制和触屏事件。可以在这个区域内绘制图形和文字,还可以接收用户的操作。一个UIView的实例可以包含和管理若干个子UIView。

UIWindow在程序中的作用

1.作为容器,包含app所要显示的所有视图
2.传递触摸消息到程序中view和其他对象
3.与UIViewController协同工作,方便完成设备方向旋转的支持

storyboard项目中的创建过程

当用户点击应用程序图标的时候,先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application,创建代理,并且把代理设置给application(看项目配置文件info.plist里面的storyboard的name,根据这个name找到对应的storyboard),开启一个事件循环,当程序加载完毕,他会调用代理的didFinishLaunchingWithOptions:方法。在调用didFinishLaunchingWithOptions:方法之前,会加载storyboard,在加载的时候创建一个window,接下来会创建箭头所指向的控制器,把该控制器设置为UIWindow的根控制器,接下来再将window显示出来,即看到了运行后显示的界面。

rootViewController和addSubview的不同

创建一个控制器,把view添加到uiwindow上面有两种方式
1.rootViewController
 rootViewController是UIWindow的一个遍历方法,通过设置该属性为要添加view对应的ViewController,UIWindow将会自动将其view添加到当前window中,同时负责ViewController和view的生命周期的维护,防止其过早释放

2.addSubview
 直接将view通过addSubview方式添加到window中,程序负责维护view的生命周期以及刷新,但是并不会为去理会view对应的ViewController,因此采用这种方法将view添加到window以后,我们还要保持view对应的ViewController的有效性,不能过早释放。

提示:不通过控制器的view也可以做开发,但是在实际开发中,不要这么做,不要直接把view添加到UIWindow上面去。因为,难以管理。以后的开发中,建议使用rootViewController。

UIView有关图层布局的方法

一个 UIView 里面可以包含许多的 Subview(其他的 UIView),而这些 Subview 彼此之间是有层级关系的。
1.新增Subview

 [UIView addSubview:Subview];     //替UIView增加一个Subview

2.移动图层
在UIView中将Subview往前或是往后移动一个图层,往前移动会覆盖住较后层的 Subview,而往后移动则会被较上层的Subview所覆盖。

[UIView bringSubviewToFront:Subview];       //将Subview往前移动一个图层(与它的前一个图层对调位置)
[UIView sendSubviewToBack:Subview];      //将Subview往后移动一个图层(与它的后一个图层对调位置)

3.交换两个Subview彼此的图层层级

[UIView exchangeSubviewAtIndex:indexA withSubviewAtIndex:indexB];    //交换两个图层

4.取得子视图在UIView中的索引值(Index )

NSInteger index = [[UIView subviews] indexOfObject:Subview名称];       //取得Index

(注意:如果没有UIWindow,界面默认是黑色的,虽然可以创建一个界面,并更改它的颜色,使主界面有颜色显示出来,但此界面并不能交互,不属于控制器的 view,具体来讲,在此view 上创建 button 不能点击)。

UIWindow

UIWindow是一种特殊的UIView,通常在一个App中只会有一个UIWindow;

iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的View,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了.

一个程序之所以能显示在屏幕上,完全是因为它有UIWindow,没有UIWindow,就看不见任何UI界面;

添加UIView到UIWindow中的两种常见方式:

1> 直接将view添加到UIWindow中,但并不会理会view对应的UIViewController

?


1

- (void)addSubview:(UIView *)view;

2> 自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期;

?


1

@property(nonatomic,retain) UIViewController *rootViewController;

常用方法:

?


1

2

 - (void)makeKeyWindow;  //让当前UIWindow变成keyWindow(主窗口)

 - (void)makeKeyAndVisible;  //让当前UIWindow变成keyWindow,并显示出来

UIWindow的获得:

?


1

[UIApplication sharedApplication].windows

在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象(平时输入文字弹出的键盘,就处在一个新的UIWindow中).

?


1

[UIApplication sharedApplication].keyWindow

用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每时每刻只能有一个UIWindow是keyWindow.如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow.

?


1

view.window

获得某个UIView所在的UIWindow.

时间: 2024-10-13 08:01:07

walker代理深入浅出——程序的启动原理(下)(探究 UIWindow)的相关文章

iOS常见文件及程序的启动原理

一. iOS中常见文件 (一). Xcode6之前 创建项目,默认可以看见一个存放框架的文件夹 info文件以工程文件名开头,如:第一个项目-Info.plist 项目中默认有一个PCH文件 (二). Xcode6之后(包括Xcode6) 创建项目,没有框架文件夹,使用时系统才去加载 info文件不以工程文件名开头,如:Info.plist 项目中没有PCH文件 (三). Info.plist文件(项目配置文件) 作用:保存应用的信息,软件名称.版本号等等,相当于身份证 Bundle name:

iOS程序的启动原理

1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicationMain函数里面做了什么事情: 1> 创建UIApplication对象 2> 创建UIApplication的delegate对象—–PYAppDelegate 3> 开启一个消息循环 每监听到对应的系统事件时,就会通知AppDelegate 4> 为应用程序创建一个UIWindow对象(继承自UIView),设置为AppDelegate的window属性 5> 

iOS程序启动原理是什么

当刚开始学习ios开发的时候,我们学会做的第一件事就是创建一个新的项目.每次我都会好奇,为什么我们选择创建一个Single View Application项目的时候,什么代码都不用敲就可以在模拟器上运行程序了.要解答这个问题需要明白一点程序的启动原理,看完之后你就会明白. 首先,建立一个Single View Application项目以方便我们的研究.可以明确的是,不论是C语言还是Objiective-C语言程序,程序运行的入口都是main函数.所以我们从main函数开始入手. 创建新项目

简析程序启动原理

当刚開始学习ios开发的时候.我们学会做的第一件事就是创建一个新的项目.每次我都会好奇,为什么我们选择创建一个Single View Application项目的时候,什么代码都不用敲就能够在模拟器上执行程序了.要解答这个问题须要明确一点程序的启动原理.看完之后你就会明确. 首先,建立一个Single View Application项目以方便我们的研究.能够明白的是.不论是C语言还是Objiective-C语言程序,程序执行的入口都是main函数.所以我们从main函数開始入手. 创建新项目

12.ios之程序启动原理

掌握 ?Info.plist和pch文件的作用 ?UIApplication的常见使用 ?AppDelegate的代理方法 ?UIApplication.AppDelegate.UIWindow.UIViewController的关系 ?iOS程序的完整启动过程 项目中常见文件 Info.plist常见的设置 ?建立一个工程后,会在Supportingfiles文件夹下看到一个"工程名-Info.plist"的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 ?在旧版本Xcod

Android启动原理剖析

我们知道Android是以一个Activity为单位的,但是我们并没有看到一个Activity是怎么开始启动的.今天我 们就从Android的源代码开始讲吧. ActivityThread: Android的一个apk在打开时,使用到的第一个类就是这个类.我们先来说这个类.等说完这个类就能了解Android应用程序的启动原理了.这货名字取名有一个Thread结尾,貌似是一个线程类.其实他并不是一个线程类,这个类没有继承任何类.或者说是直接继承在Object类.我们来看ActivityThread

Android启动原理剖析【转】

我们知道Android是以一个Activity为单位的,但是我们并没有看到一个Activity是怎么开始启动的.今天我 们就从Android的源代码开始讲吧. ActivityThread: Android的一个apk在打开时,使用到的第一个类就是这个类.我们先来说这个类.等说完这个类就能了解Android应用程序的启动原理了.这货名字取名有一个Thread结尾,貌似是一个线程类.其实他并不是一个线程类,这个类没有继承任何类.或者说是直接继承在Object类.我们来看ActivityThread

iOS程序启动原理

程序启动原理 掌握 Info.plist和pch文件的作用 UIApplication的常见使用 AppDelegate的代理方法 UIApplication.AppDelegate.UIWindow.UIViewController的关系 iOS程序的完整启动过程 … Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 在旧版本Xcode创建的工程中,这个

IOS开发——UI进阶篇(七)程序启动原理

一.Info.plist常见的设置 1.建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 在旧版本Xcode创建的工程中,这个配置文件的名字就叫“Info.plist” 项目中其他Plist文件不能带有“Info”这个字眼,不然会被错认为是传说中非常重要的“Info.plist” 项目中还有一个InfoPlist.strings的文件,跟Info.plist文件的本地化相关 2.常见属性