了解iOS开发中的特殊UIView之UIWindow

来源:互联网 发布:如何提高淘宝等级 编辑:程序博客网 时间:2024/05/17 02:17
    在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面。这篇文章简单介绍下UIWindow这个类,大家结合老郭的iOS开发培训课程视频以及后续的文章,提高对iOS编程的理解。


  窗口是视图的一个子类,他的作用是:


1.提供一个区域来显示视图;


2.将事件分发给视图。


通常程序只有一个窗口,表现为UIWindow的一个实例。


出现:


  当程序启动时,窗口会被程序创建或者从nib文件直接进行装载(应用程序启动之后,先创建Application,再创建它的代理,之后创建UIwindow),同时创建控制器的若干个view加入窗口,然后各视图就被显示到屏幕上了(窗口本身不具有任何可见的内容)。在这之后,我们基本上不会再次用到它。

操作机制:


  在iOS中,我们不能对窗口进行操作,所有对窗口的操作都需要通过其编程接口来实现。应用程序可以借助窗口对象来进行事件传递。窗口对象会持续跟踪当前的第一响应者对象,并在UIApplication对象提出请求时将事件传递给它。

尺寸:


  iOS中,应该将窗口初始的边框尺寸设置为整个屏幕的大小。


1.窗口是由nib文件直接得到,IB并不会允许我们创建的窗口比屏幕尺寸小;


2.窗口由我们代码创建,我们可以通过UIScreen的对象来取得屏幕矩形的尺寸,从而传给窗口,代码:


UIWindow* myWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];


  iOS虽然可以创建多个窗口,也可以叠放,但是在应用程序中,没必要也没有理由创建多个多余的窗口,会影响到事件的传递,大家要注意这点。


  系统自身会使用额外的窗口来显示系统状态条、重要的警告、以及位于应用程序窗口上方的其它消息(如呼入的电话)。如果您希望在自己的内容上方显示警告,可以使用UIKit提供的警告视图(iOS8后提供了一个新的UIAlertController替代其功能,前面文章有介绍),而不应创建额外的窗口。


设置主窗口:


//让窗口成为主窗口,并且显示出来。有这个方法,才能把信息显示到屏幕上。
[self.window makeKeyAndVisible];
//让uiwindow成为主窗口,但不显示。
[self.window makeKeyWindow];


获取UIWindow:


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


[UIApplication sharedApplication].windows
 

  获取应用程序的主窗口,用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow:


[UIApplication sharedApplication].keyWindow
  提示:只有主窗口才能响应键盘的输入事件,如果不能输入内容,可以查看是否是显示在主窗口上,不在主窗口上的不能响应。


获得某个UIView所在的UIWindow:



view.window



UIWindow级别(UIWindowLevel):


UIWindow在显示的时候会根据UIWindowLevel进行排序的,即Level高的将排在所有Level比他低的层级的前面。 


  当Level层级相同的时候,只有第一个设置为KeyWindow的显示出来,后面同级的再设置KeyWindow也不会显示。


IOS系统中定义了三个window层级,其中每一个层级又可以分好多子层级(从UIWindow的头文件中可以看到成员变量CGFloat _windowSublevel;),不过系统并没有把则个属性开出来。我们打印输出这三个level的值分别是:Normal,StatusBar,Alert。打印输出他们三个这三个层级的值我们发现从左到右依次是0,1000,2000


我们可以看出:Normal级别是最低的,StatusBar处于中等水平,Alert级别最高。


注意:


  当Level层级相同的时候,只有第一个设置为KeyWindow的显示出来,后面同级的再设置KeyWindow也不会显示。


  UIWindow在显示的时候是不管KeyWindow是谁,都是Level优先的,即Level最高的始终显示在最前面。


  通常我们的程序的界面都是处于Normal这个级别上的,系统顶部的状态栏应该是处于StatusBar级别,UIActionSheet和UIAlertView这些通常都是用来中断正常流程,提醒用户等操作,因此位于Alert级别。 
0 0
原创粉丝点击