1.UIWindow & UIWindowLevel
一、簡單介紹UIWindow是什么?
UIWindow是一種特殊的UIView,UIWindow繼承自UIView,也就是說它本身就是一個視圖的容器。通常一個App一般有一個UIWindow,也就是AppDelegate中的UIWindow,但可以手動創(chuàng)建多個UIWindow,同時加到程序里面。
UIWindow在程序中主要起到三個作用:
1、作為容器,包含app所要顯示的所有視圖
2、傳遞觸摸消息到程序中view和其他對象
3、與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持
二、通常我們可以采取兩種方法將view添加到UIWindow中:
1、addSubview
直接將view通過addSubview方式添加到window中,程序負責維護view的生命周期以及刷新,
但是并不會為去理會view對應的ViewController,因此采用這種方法將view添加到window以后,
我們還要保持view對應的ViewController的有效性,不能過早釋放。
2、rootViewController
rootViewController是UIWindow的一個遍歷方法,通過設(shè)置該屬性為要添加view對應的ViewController,
UIWindow將會自動將其view添加到當前window中,同時負責ViewController和view的生命周期的維護,防止其過早釋放
三、WindowLevel
UIWindow在顯示的時候會根據(jù)UIWindowLevel進行排序的,即Level高的將排在所有Level比他低的層級的前面。下面我們來看UIWindowLevel的定義:
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系統(tǒng)中定義了三個window層級,其中每一個層級又可以分好多子層級(從UIWindow的頭文件中可以看到成員變量CGFloat _windowSublevel;),不過系統(tǒng)并沒有把則個屬性開出來。UIWindow的默認級別是UIWindowLevelNormal,我們打印輸出這三個level的值分別如下:
UIViewSample[395:f803] Normal window level: 0.000000
UIViewSample[395:f803] Alert window level: 2000.000000
UIViewSample[395:f803] Status window level: 1000.000000
window在創(chuàng)建的時候,默認是UIWindowLevelNormal(0.0),這個值越大,層次越靠上,也就是說
windowLevel大于0,小于1000的時候,在statusbar之下,在默認的window之上
windowLevel大于1000的時候,就在statusbar之上了。
2. keyWindow
keyWindow是獲取鍵盤和其他非觸摸事件的window,同一時間只能有一個window為keywindow。所以,如果自己創(chuàng)建的Window要相應除觸摸外的事件,要設(shè)置為keyWindow.
makeKeyWindow //設(shè)置當前window為main window.
keyWindow的”生命周期”
這兩個方法類似于viewWillAppear等,自動觸發(fā),不要手動調(diào)用。
- becomeKeyWindow
- resignKeyWindow
所以,以后需要呈現(xiàn)在頂部的視圖,要添加到UIApplication.sharedApplication()
.keyWindow 上。
keyWindow 確保了你一定能拿到當前活躍的window,文檔中是這樣描述 keyWindow 的:
原則上是只有一個window與用戶交互,但不代表就只存在一個window。Alert也是一個window
keyWindow就是指活躍的window。
iphone鍵盤也在一個window里,叫UITextEffectsWindow;
window可以層疊的,各個window都可以被響應。