簡介
概念
UIWindow是iOS中用于顯示內(nèi)容敬惦、處理觸控等功能的基礎(chǔ)
重要知識
- 每個app必須要有一個keyWindow才能正常運行蔫浆,如果是通過代碼創(chuàng)建的項目突颊,需要為AppDelegate創(chuàng)建一個window丧枪,并調(diào)用
makeKeyAndVisible()
來讓window顯示。當(dāng)然不要忘了設(shè)置window的rootViewController - window通過windowLevel來決定window顯示的層級日杈,也就是z軸的值遣铝。系統(tǒng)定義了normal, statusBar, alert三個層級佑刷,當(dāng)前這個windowLevel本質(zhì)是個rawValue為Int的枚舉,所以我們可以按需要創(chuàng)建任意層級的level酿炸。如在statusBar上瘫絮,在alert下的層次
常用方法
- 通過設(shè)置rootViewController來更換場景。
- 如登錄完成后填硕,要進入主頁面麦萤,此時登錄相關(guān)的頁面可以釋放,替換成主頁面相關(guān)的控制器
- 通過
keyWindow.addSubview()
在最上層的視圖上面顯示內(nèi)容廷支。- 如當(dāng)前控制器可能被嵌入在UINavigationController或者UITabBarController里,上方的導(dǎo)航欄和下面的tabBar被不屬于子控制器栓辜,而我們想把內(nèi)容全屏顯示恋拍。
- 如在網(wǎng)絡(luò)層或者某些Model層想展示一個toast,此時不方便獲取到目前現(xiàn)在顯示的視圖
- 通過新建一個windowLevel更高的UIWindow藕甩,來實現(xiàn)某些內(nèi)容永遠處于最上面施敢。
- 如想實現(xiàn)一個浮動按鈕,不會被任何其他內(nèi)容遮蓋狭莱。
- 如某些游戲會在進入前臺時同步數(shù)據(jù)僵娃,同步時用動畫要遮住正常內(nèi)容,以防用戶改時間作弊腋妙。
- 全屏的顯示或者橫屏顯示內(nèi)容
- 通過window的safeInset來確定是不是劉海屏默怨。
延伸
在用 UIApplication.shared.keyWindow 獲取keyWindow時,現(xiàn)在會出現(xiàn)一個該屬性被廢棄的警告骤素。
出現(xiàn)這個警告的原因是匙睹,iOS 13 之后,一個app可能有多個scene济竹,也就是說可能有多個keyWindow痕檬,所以該屬性被廢棄。
如果app沒有多個scene送浊,使用該方法獲取keyWindow是完成沒問題的梦谜。