[ios note] windows

原文档位置

每个ios程序都至少需要一个window, UIWindow类的一个实例,有一些则可以需要更多。

Window有如下职责:
包含可视的内容
把用户操作分发给View和其它对象 这一过程中扮演重要角色
帮助view controller处理位置变化

在iO中,window没有标题状态栏一类的东西,就是个空白的框
同样,程序要改变内容时,也不改变window,改变的是window包含的view中最前面的那几枚。

大部分的程序只用一个window,这个window占据全屏,从main nib file载入(或者纯手工代码实现)。

一般来说,其它的window都是由系统创建的,由特定的event触发,比如有电话接入。

windows相关任务


大部分程序一辈子只动一次window,就是在程序开始时创建一下。
如果需要,也可以用window实现来做一些事情:
重新转换坐标点和rectangle
see “Converting Coordinates in the View Hierarchy.”
用notifications来跟踪window相关的变化
see “Monitoring Window Changes.”

建立和配置windows


可以用IB,也可以手动
运行时创建,delegate obejct retain一个window
如果程序用了多于一个winows, 一般做法是用时才加载(另一个)
无论程序是前台还是后台,主window都在launch time(?)创建。
建立和配置的代价并不高。
但如果程序启动直接进后台,最好不要在它进入前台前做window.

用IB
一般不用自己动手,xcode自带一个MainWindow.xib
在application delegate object里面定义outlet,在程序中使用这个outlet操作window
注意
建议使window全屏,如果不这样做,可能有一些touch事件无法收到
这是因为,只有window范围内的touch事件能被识别。view按说是在window中,但iOS并不限制view显示在winows外。即:若不全屏,有可以出现以下情况:看到一个按钮,点击无反应,因为它不在window的rectangle的范围内。
用IB时也要:
使用outlet关联到delegate或file owner,这样代码中才能访问。
如果要用自已的xib替代MainWindow,需要在Info.plist中修改属性。

更多资源 see Interface Builder User Guide.

手动
在delegate的application:didFinishLaunchingWithOptions:中加入如下代码
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
这里假设delegate有一个用来retain window的属性(self.window)
建window确认全屏,不需要为statues bar之类的东西预留空间,这事儿在放view的时候做,view controller会自动处理。
往window里面添加view
每个window都有一个相应的root view obejct (由相应的view controller管理)
使用单一的root view可以简化工作。
[window addSubview:viewController.view];
用nib file来做这事更简单,只要设一个属性。
可以用任何view来做 root view。
配置一个root view时,你需要同时设定它在window中的大小和位置。
改变window Level
每个window都有可配置的 windowLevel 属性,决定其与其它window的关系,上还是下。
监视window改变
使用相关notifications

 

相关文章:

右舷

↑ Grab this Headline Animator

Did you enjoy this post? Why not leave a comment below and continue the conversation, or subscribe to my feed and get articles like this delivered automatically to your feed reader.

Comments

No comments yet.

Leave a comment

(required)

(required)