幕后英雄UIWindow

来源:互联网 发布:新点招投标制作软件 编辑:程序博客网 时间:2024/05/16 19:08

先看一段摘抄的代码

    UIWindow*window = [UIApplication sharedApplication].keyWindow;    self.frame =window.bounds;    [windowaddSubview:self];

看着很神奇,不是吗?居然可以直接往UIWindow上添加view,有点黑魔法的感觉。UIWindow究竟是什么,如何使用,我们一起往下看来自iOS官方的解释。

每个iOS应用必须包含一个window用于展示应用的交互页面。虽然window的作用非常关键,大多数情况下,开发者不需要和它打交道。只有在应用支持显示到外部屏幕的情况,我们才会使用到window。

概要:

在iOS中,window包含了视图,并且负责管理视图在设备上的展示。与window相关的screen则代表了特定设备的显示屏。如果你的应用支持用户将视图投射到外部显示屏幕上的话,你就需要另外创建一个window用于展示内容。

重要概念:

1,UIWindow类是UIView的子类,可以看作是特殊的UIView。
2,一般应用程序只有一个UIWindow对象。
3,即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件。

Window的重要作用:

作用1,window包含了应用的可视区域;
作用2,window负责接收触摸事件,然后分发给各个视图;
作用3,window负责接收横竖屏的变化,然后分发给各个视图。

关于window的创建:

1,一个应用至少包含一个window;
2,在没有storyboard的时代,我们必须在进入应用时创建一个window,并为其关联一个rootviewcontroller。关联上后,window会自动add其视图,并且计算合适展示尺寸。展示的尺寸受到几个因素的影响:状态栏是否可见,当前设备的横竖屏情况,以及视图是否是全屏显示。代码如下:

    - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    myViewController = [[MyViewController alloc] init];    window.rootViewController = myViewController;    [window makeKeyAndVisible];    return YES;    }

3,在storyboard的时代,主storyboard会自动创建一个window,默默的为我们事。

创建另一个window唯一目的是,用于支持显示到外部屏幕上:

如果你的应用支持外部显示屏幕,你需要额外创建一个window用于暂时内容。你可以在外部显示屏幕上显示同样内容-称作为“镜像”,也是默认会发生的情况;当然你也可以展示不同的内容。

某些事件只会发送给主window:

只有主window才能接收键盘事件,以及非触摸的事件。同一时刻只能有一个主window。触摸事件一定会被分发给被触摸的window,但是不带坐标值之类的事件,只会发送给主window。
绝大多数情况下,承载应用内容的窗口就是主窗口。但在弹出警告视图或弹出式输入视图时,它们就成为了主窗口。

其他参考资料

关于window的具体使用:如何创建和销毁window?如何读取window?window的层级,高层级会覆盖在低层级上?设置主window?window在隐藏,显示,被覆盖,或被设置为主window时会发出特定通知,如果需要对其处理,可以注册监听感兴趣的通知。请见以下两篇文章,我就不做搬运工了。
http://blog.csdn.net/chengyingzhilian/article/details/7872096
http://www.cnblogs.com/wendingding/p/3770052.html

我的总结:

1,Apple的建议是若非要投射到外部显示屏,不需要创建新window。所以,直接创建或使用window是黑魔法。若非必要,不要去操作window。
2,直接从window层面进行操作,可以获取意想不到的方便和效果。感兴趣的同学,可以在工程了搜索以下哪些第三方代码里用到这个黑魔法。
3,一定要记住:window其实是uiview的子类。

学的越多,做的越快;学的越多,做的越好。

0 0
原创粉丝点击