简介
UIWindow为用户交互界面提供了一个背景,并且监听和处理用户的操作。UIWindow 本身并不可见,但是它们对于views对象的显示尤为重要。每一个显示的view 都是嵌套在一个window上面的,并且每一个window都是相互独立的。App的时间总是先由window截获,然后发送给相应的view进行处理。window和viewcontroller一起合作才实现了app关于页面转向和其他一些基础的功能
概览
WIndow 是应用的基本组成部分,但是实际上你很少和window打交道。UIKit已经帮你解决了大部分和window操作相关的事件了。你需要做的就是:
- 在App开始时,提供一个主Window。
- 如果有其他战士需求,就创建另外的Windows。
大部分App都只用到一个Window。但是你有其他需求的时候,也可以创建另外的WIndows来展现内容。
你可以使用Window来完成一下工作:
- 设置window 的z坐标,它会影响该window相对于其他window的视角。
- 显示window,并让它成为事件接收器。
- 获取Window 中坐标的转换(转出 或者 转入)。
- 改变window 的根视图控制器。
- 改变 Window 所显示的 UIScreen。
一般不建议继承UIWindow,因为能想要集成在UIWindow 上的操作,能够很容易的在UIViewController上面实现出来。 但是某些情况下,当你想要复写 becomeKey() 和 resignKey() 这两个方法时,可以继承UIWindow。
创建额外的Windows
除了主Window,你还需要负责创建和维护其他的windows。通常的使用方式是在额外的Window 上面显示内容,或者在同一屏幕上显示多个Windows。
当创建Window 的时候,需要赋给Window大小和在哪个屏幕上显示。你也应当写明提供视图的根视图控制器。尽管你可以直接在Window上面添加Views,但是使用试图控制器可以更方便的来管理Window 的内容。使用视图控制器可以分隔Window 和 显示的内容。
Listing 1 是一个创建第二个Window 的例子。
Listing 1 :
func configureExternalDisplayAndShowWithContent(rootVC : UIViewController) {
let screens = UIScreen.screens()
// Configure the content only if a second screen is available.
if screens.count > 1 {
let externalScreen = screens[1]
let screenBounds = externalScreen.bounds
// Create and configure the window.
self.externalWindow = UIWindow.init(frame: screenBounds)
self.externalWindow!.windowLevel = UIWindowLevelNormal
self.externalWindow!.screen = externalScreen
// Install the root view controller
self.externalWindow!.rootViewController = rootVC
// Show the window, but do not make it key
self.externalWindow!.hidden = false
}
else {
// No external display available for configuration.
}
}
理解键盘交互
因为触摸事件是传递给所在的Window的,而那些没有相对坐标位置的事件则是传递给 key window ,一个时间点下只有一个key window,你可以通过isKeyWindow 属性来改变谁是主 Window。大多数情况下,你App 的主window 就是 key window。但是UIKit 也设计了不同的window。
如果你需要知道谁是 key window,可以通过监听 UIWindowDidBecomeKey 和 UIWindowDidResignKey 这两个系统通知来获取信息。当key window 发生改变的时候,系统会发出这两个通知。