簡(jiǎn)介
UIWindow為用戶交互界面提供了一個(gè)背景,并且監(jiān)聽和處理用戶的操作畏邢。UIWindow 本身并不可見舒萎,但是它們對(duì)于views對(duì)象的顯示尤為重要。每一個(gè)顯示的view 都是嵌套在一個(gè)window上面的臂寝,并且每一個(gè)window都是相互獨(dú)立的。App的時(shí)間總是先由window截獲败徊,然后發(fā)送給相應(yīng)的view進(jìn)行處理素征。window和viewcontroller一起合作才實(shí)現(xiàn)了app關(guān)于頁(yè)面轉(zhuǎn)向和其他一些基礎(chǔ)的功能
概覽
WIndow 是應(yīng)用的基本組成部分萝挤,但是實(shí)際上你很少和window打交道根欧。UIKit已經(jīng)幫你解決了大部分和window操作相關(guān)的事件了。你需要做的就是:
- 在App開始時(shí)凤粗,提供一個(gè)主Window。
- 如果有其他戰(zhàn)士需求柔袁,就創(chuàng)建另外的Windows异逐。
大部分App都只用到一個(gè)Window。但是你有其他需求的時(shí)候灰瞻,也可以創(chuàng)建另外的WIndows來(lái)展現(xiàn)內(nèi)容。
你可以使用Window來(lái)完成一下工作:
- 設(shè)置window 的z坐標(biāo)燎竖,它會(huì)影響該window相對(duì)于其他window的視角要销。
- 顯示window,并讓它成為事件接收器纤掸。
- 獲取Window 中坐標(biāo)的轉(zhuǎn)換(轉(zhuǎn)出 或者 轉(zhuǎn)入)凳鬓。
- 改變window 的根視圖控制器。
- 改變 Window 所顯示的 UIScreen缩举。
一般不建議繼承UIWindow匹颤,因?yàn)槟芟胍稍赨IWindow 上的操作,能夠很容易的在UIViewController上面實(shí)現(xiàn)出來(lái)辽慕。 但是某些情況下赦肃,當(dāng)你想要復(fù)寫 becomeKey() 和 resignKey() 這兩個(gè)方法時(shí)公浪,可以繼承UIWindow船侧。
創(chuàng)建額外的Windows
除了主Window,你還需要負(fù)責(zé)創(chuàng)建和維護(hù)其他的windows镜撩。通常的使用方式是在額外的Window 上面顯示內(nèi)容袁梗,或者在同一屏幕上顯示多個(gè)Windows。
當(dāng)創(chuàng)建Window 的時(shí)候遮怜,需要賦給Window大小和在哪個(gè)屏幕上顯示。你也應(yīng)當(dāng)寫明提供視圖的根視圖控制器即碗。盡管你可以直接在Window上面添加Views涝桅,但是使用試圖控制器可以更方便的來(lái)管理Window 的內(nèi)容。使用視圖控制器可以分隔Window 和 顯示的內(nèi)容冯遂。
Listing 1 是一個(gè)創(chuàng)建第二個(gè)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.
}
}
理解鍵盤交互
因?yàn)橛|摸事件是傳遞給所在的Window的壁却,而那些沒(méi)有相對(duì)坐標(biāo)位置的事件則是傳遞給 key window 展东,一個(gè)時(shí)間點(diǎn)下只有一個(gè)key window炒俱,你可以通過(guò)isKeyWindow 屬性來(lái)改變誰(shuí)是主 Window。大多數(shù)情況下权悟,你App 的主window 就是 key window。但是UIKit 也設(shè)計(jì)了不同的window谦铃。
如果你需要知道誰(shuí)是 key window榔昔,可以通過(guò)監(jiān)聽 UIWindowDidBecomeKey 和 UIWindowDidResignKey 這兩個(gè)系統(tǒng)通知來(lái)獲取信息瘪菌。當(dāng)key window 發(fā)生改變的時(shí)候嘹朗,系統(tǒng)會(huì)發(fā)出這兩個(gè)通知。