# Window

用户界面的背景并且分发事件到UIView对象

## 概述

windows同view controller一起处理消息并且执行用户操作的相关任务。UIKit处理很多页面相关的操作，结合其他对象实现应用行为。

当需要做如下工作的时候使用window：

* 提供一个主window显示应用内容
* 创建额外的window显示额外的内容

  一般来说，xcode提供应用主window。新版iOS项目使用storyboard定义应用界面。storyboard需要一个window属性，配置在xcode默认提供的app delegate对象上。如果你的应用不用storyboard，那么需要自己创建一个。

大多数应用需要一个window用于在设备的主屏幕上显示应用内容。 虽然你能创建其他的window在设备主屏幕上，额外的window通常用于在其他屏幕上显示内容。

你也可以用UIWindow对象处理其他任务：

* 设置window的z轴，影响相对于其他window的遮挡层级关系
* 显示window并且获取键盘焦点
* window坐标转换
* 改变window的root view controller
* 改变显示window的screen

window自身无法显示，但是window通过window的root view controller控制view。在storyboard中配置root view controller，给你的接口增加适当的view。

很少需要创建UIWindow子类。需要通过window实现的一些操作一般来说是用view controller来实现会更容易一些。偶尔可能想重写becomeKey或者resignKey方法来实现自定义的行为以处理window按键状态变化。

### 理解按键交互

由于触摸事件分发window，内容包括发生的位置。不包含坐标信息的事件发送到key windows。同一时间只有一个window是key window，可以使用window的isKeyWindow属性来判断他的状态，大部分时间，主window是key window，但是UIKit可能指定一个不同window。

如果需要知道哪个window是key window可以监听didBecomeKeyNotification和didResignKeyNotification通知。当key window发生改变的时候系统发出通知。调用类方法可以强制设置window为key window。
