UIWindow中文详解

1.window

    每个iOS应用都会有至少一个window,这个window就是UIWindow的实例,也有些应用会有多个window。window会有如下几个职责:

  • 它包含了应用中的可见内容;
  • 它在视图和应用对象之间传递触摸事件中起很重要的作用;
  • 它和视图控制器配合完成方向转变。

    在iOS系统中,windows没有标题栏、关闭框以及其他可视控件。一个window就是一个或多个视图的空白容器,而且应用不能通过window来改变自己的显示内容。当你想要改变现显示容的时候,改变最上层的视图就可以了。

    大多数iOS应用在其生命周期内只使用一个window,这个window从应用的主nib文件中加载,铺满整个主屏幕。当然,如果你的应用支持外部显示,它会额外创建一个window,用于外部显示。系统会创建其他典型的window,一般是在响应特殊事件时创建,例如来电显示。


2.牵扯到window的任务

    对于大多数应用而言,和window相关操作只是在window创建的时候。然而,你可以使用window对象去执行一些和应用相关的任务,例如:

  • 利用window对象去设置窗口(window)的原点和坐标系统。比如在使用一个特殊view之前你想改变window的坐标系统(译注:手动切换横竖屏就得用到这个知识点)。
  • 在window的通知方法中可以追踪到window相关的变化。window会在显示、隐藏或者同意了注册key的状态的时候发送相应的通知。你可以在其他地方监听这些通知并作出相应操作。

3.window的创建和配置

    你可以代码或者InterfaceBuilder来创建并设置window。您在启动时创建了窗口,并应保留它,并将其保存到应用程序代理对象中的引用。如果需要额外的window,则在需要用的时候创建即可。

    创建window不需要考虑应用实在前台启动还是后台启动。创建和设置一个window不需要花太多资源。如果程序直接在后台启动,那么你就不能让window可见,直到window到前台之后再让其可见。


    3.1用Interface Builder创建window

    用IB创建window非常简单,因为Xcode的工程模板可以替你你创建。每个应用都会包含一个主XIB文件,这个XIB就包含了一个主window。另外,这些模板也为window在应用的代理对象中定义了outlet,你可以在代码中通过outlet取到window对象。
    注意:在使用IB创建window的时候,应该在属性设置栏中设置为全屏。如果没有设置为全屏,且window小于手机的屏幕尺寸,那么一些视图的触摸时间肯接收不到。这是因为window接受不到自己区域以外的触摸事件。如果视图的触摸点没在window的区域范围内,则响应不到触摸事件。所以要确保window是全屏。

    如果你重构代码时用到 IB添加window,也很简单,像XIB文件中拖一个window对象,然后进行如下操作:

  • 要在运行时访问window,应该把window和outlet相连。outlet一般情况下是在application delegate中,也可以是这个NIB文件对应的代码文件。
  • 重构过程中如果需要新建一个主NIB,那就得在info.plist文件中设置NSMainNibFil键。通过设置NSMainNibFil的值来确保这个window在代理方法application:didFinishLaunchingWithOptions:被调用是得到加载。


    3.2纯代码创建window

    如果你跟喜欢用代码创建window,那么你应该在代理方法application:didFinishLaunchingWithOptions:中添加如下代码:

  1. self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];  

    上面代码中的 self.window,是在application delegate中已经声明过得属性,用来保存window对象。如果你创建的是用于外部显示的window,应该给它重新命名,并且需要设置bounds。

    创建window的时候,要吧bounds设置为屏幕大小,不能有任何缩减。


    3.3把内容添加到window上

    每个window都有一个单独的根视图,这个根视图包含了所有需要显示的内容。它简化了界面的变化操作。要显示新的内容,只需要替换原来的根视图。在window上添加视图的话使用addSubview:方法即可,例如:

  1. [window addSubview:viewController.view];  

替代前面的代码的是,你可以在nib文件中选择性的设置rootViewController属性。这个属性提供便利的方法让你去设置window中的根视图。如果这个属性在window加载之后被设置了,UIKit会自动去吧viewController中的view设为window的根视图。这个rootViewController只是用来为window设置根视图的,而不是用来让window和viewController交互的。

你可以根据你的意愿把任何view作为window的根视图。根据你的界面设计,你可以把系统提供的view设为根视图,也可以把自定义view设为根视图。系统视图可以是scroll views, table views, and image views等等。

设置根视图的时候,应该确保视图在window的尺寸范围之内。一些应用没有状态栏或者状态栏是透明的,这时你只需要让根视图充满window就行。如果有状态栏且不是透明的,那么设置视图尺寸的时候应该减去状态栏的高度,以确保不被状态栏遮挡。

注意:如果根视图是由一些container型的控制器提供(例如tab bar controller, navigation controller, 或split-view controller),就不需要手动设置其尺寸。系统会自动为你设好。


    3.4改变window等级

    每个UIWindow都有一个windowLevel属性,它决定了window之间的关系。多数情况下是不需要去设置这个属性的,一个新的window在创建时就被自动设置normal window level,normal window level表示这个window现实和当前应用相关的内容。Higher window level的window展示时会浮窗于应用界面,例如状态栏和警告信息。尽管你可以手动设置level,其实当你用到特定界面的时候系统已经为你设置好了。例如当你隐藏或显示状态栏的时候,系统自动创建所需要的window。


4.window发生变化时的操作

     四个通知:


5.用外部显示来显示内容

    5.1处理屏幕链接和非链接的通知

    略

    5.2外部显示的window配置

    略

    5.3外显得屏幕模式配置

    略


原文链接:点击打开链接 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值