[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
用notifications来跟踪window相关的变化
建立和配置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
相关文章:
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