UIWindow簡介:
在iOS App中,UIWindow是最頂層的界面內(nèi)容,我們使用UIWindow和UIView來呈現(xiàn)界面。UIWindow并不包含任何默認的內(nèi)容,但是它被當作UIView的容器,用于放置應用中所有的UIView。
從繼承關(guān)系來看,UIWindow繼承自UIView,所以UIWindow除了具有UIView的所有功能之外,還增加了一些特有的屬性和方法,而我們最常用的方法,就是在App剛啟動時,調(diào)用UIWindow的makeKeyAndVisible方法。
為UIWindow增加UIView:
通常我們有兩種辦法給UIWindow增加子UIView:
1.通過調(diào)用addSubView方法,因為UIWindow是UIView的子類,所以它可以使用UIView的addSubView方法給自己增加子UIView,從而承擔容器的作用;
2.通過設(shè)置其特有的rootViewController屬性。設(shè)置該屬性后,UIWindow會自動將view controller的view添加到當前window中,同時負責維護view controller和view的生命周期。上述在application:didFinishLaunchingWithOptions:中使用的就是這種辦法;
系統(tǒng)對UIWindow的使用:
通常在一個程序中只會有一個UIWindow,但有些時候我們調(diào)用系統(tǒng)的控件(例如UIAlertView)時,iOS系統(tǒng)為了保證UIAlertView在所有的界面之上,它會臨時創(chuàng)建一個新的UIWindow,通過將其UIWindowLevel設(shè)置更高,讓UIAlertView蓋在所有其他UI之上
windowLevel
那是不是新創(chuàng)建的UIWindow一定會覆蓋在界面的最上面呢?其實并不是這樣的。UIWindow有一個UIWindowLevel類型屬性windowLevel,該屬性指示了UIWindow的層級,windowLevel有三種可取值,如下所示:
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;
把這幾個值打印出來,得到結(jié)果如下:
UIWindowLevelNormal=0.000000
UIWindowLevelAlert=2000.000000
UIWindowLevelStatusBar=1000.000000
從中能夠看出,默認程序的UIWindow的層級是UIWindowLevelNormal,當系統(tǒng)需要覆蓋在其上覆蓋UIAlertView時,就會創(chuàng)建一個層級是UIWindowLevelAlert的UIWindow,**因為其windowLevel值更高,所以就覆蓋在上面了。
手工創(chuàng)建UIWindow
有些時候,我們也希望在應用開發(fā)中,將某些界面覆蓋在所有界面的最上層。這個時候,我們就可以手工創(chuàng)建一個新的UIWindow。需要注意的是,和創(chuàng)建UIView不同,UIWindow一旦被創(chuàng)建,它就自動地被添加到整個界面上了(當然,其windowLevel要足夠高)。
還有一點需要注意的是,如果我們創(chuàng)建的UIWindow需要處理鍵盤事件,那就需要合理地將其設(shè)置為keyWindow。keyWindow是被系統(tǒng)設(shè)計用來接收鍵盤和其他非觸摸事件的UIWindow。我們可以通過makeKeyWindow和resignKeyWindow方法設(shè)置UIWindow實例的keyWindow與否。
參考自張不壞的博客