以前從來沒注意過的UIWindow

好久沒有更新博客了O.O因?yàn)樽罱ぷ骱妹AT
當(dāng)然忙的時候也積累了很多以前沒注意的問題鹰贵。所以又有了很多能寫成博客的素材O.O

所以這次先來研究一下我以前從來沒注意過的UIWindow好了。


Window的作用



在iOS中街佑,一個window(也就是一個UIWindow對象)主要有這樣幾個作用:

  1. 展示app的可視內(nèi)容狼速;
  2. 將事件分發(fā)給視圖以及其他對象骂倘;
  3. 和app的view controller一起處理屏幕旋轉(zhuǎn)变姨。

其實(shí)在大多數(shù)情況下盖矫,第三方程序員不用做任何事情,window就能完成這些工作群凶。所以很多時候插爹,只有當(dāng)這個app需要支持另一個外設(shè)的屏幕的時候哄辣,程序員才會對window進(jìn)行操作请梢。


創(chuàng)建window



有好幾種創(chuàng)建window的方式:


使用storyboard:

如果程序員為app創(chuàng)建了一個storyboard赠尾,并在info.plist中指定它為main storyboard,那么在app啟動的時候毅弧,iOS會自動幫程序員做這樣幾件事情:

  1. 實(shí)例化一個window气嫁;
  2. 加載main storyboard,并且實(shí)例化其中的root view controller够坐;
  3. 將這個view controller賦值給window.rootViewController寸宵,并顯示這個window。
使用nib文件:

如果不使用storyboard元咙,也可以用nib文件來代替梯影。將一個window對象拖拽到Interface Builder文件中,并將這個文件指定為app的main interface庶香。那么在app啟動的時候甲棍,iOS也會自動創(chuàng)建window對象。
為了確保window的大小與屏幕大小吻合赶掖,需要在Interface Builder中對window對象勾選Full Screen at Launch這個屬性感猛。

手寫代碼:

當(dāng)然也可以通過手寫代碼的方式創(chuàng)建window。比如官方示例代碼:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    myViewController = [[MyViewController alloc] init];
    window.rootViewController = myViewController;
    [window makeKeyAndVisible];
    
    return YES;
}

需要注意的是奢赂,window的尺寸永遠(yuǎn)應(yīng)該是屏幕的尺寸陪白,不應(yīng)該考慮狀態(tài)欄等元素,因?yàn)檫@些是view controller應(yīng)該處理的問題膳灶。


Action Sheet和Alert View



知道了window的存在之后咱士,感覺也能知道很多事情。

比如轧钓,iOS中的UIActionSheet和UIAlertView其實(shí)是顯示在另一個window上的司致。

監(jiān)聽UIWindowDidResignKeyNotification,可以發(fā)現(xiàn)聋迎,當(dāng)action sheet彈出時脂矫,UIWindowDidResignKeyNotification通知被發(fā)送了。此時檢查app所在的window霉晕,發(fā)現(xiàn)它已經(jīng)不再是key window了庭再。


懸浮窗



以前我總以為所有的view都是被拘束在UIViewController的view中的,所以一直不知道懸浮窗的效果應(yīng)該如何實(shí)現(xiàn)牺堰。但實(shí)際上拄轻,UIWindow本身就是一個UIView,可以直接在UIWindow上添加子視圖伟葫,做出懸浮的效果恨搓。(雖然這樣不符合蘋果的設(shè)計(jì)規(guī)范)

[[[UIApplication sharedApplication].delegate window] addSubview:suspendView];

呈現(xiàn)出視圖懸浮在app之上的效果:


懸浮窗效果

黑科技?



好奇嘗試了一些奇怪的情景O.O

如果window沒有占滿整個屏幕會怎樣呢?

默認(rèn)情況下斧抱,window中的視圖依然能照常顯示常拓,但是觸屏事件無法正常分發(fā)。

官方文檔中這樣描述:

Because a window doesn’t receive touch events outside of its bounds and views aren’t clipped to the window’s bounds by default, an improperly sized window might not be able to deliver touch events to all its views.

用手寫代碼的方式可以創(chuàng)建一個任意大小的window辉浦,比如在application:willFinishLaunchingWithOptions:方法中寫:

self.window = [[XSQWindow alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];

運(yùn)行程序時弄抬,window中的子視圖依然可以照常顯示,包括window外的部分宪郊,但是在點(diǎn)擊window之外的區(qū)域時掂恕,終端會輸出錯誤信息:

unexpected nil window in _UIApplicationHandleEventFromQueueEvent, _windowServerHitTestWindow: <XSQWindow: 0x14c614a20; baseClass = UIWindow; frame = (0 0; 200 200); gestureRecognizers = <NSArray: 0x174059740>; layer = <UIWindowLayer: 0x174220e60>>

并且觸屏點(diǎn)對應(yīng)的視圖無法接收到這次的觸屏事件。

如果在一個app中創(chuàng)建多個window會怎么樣弛槐?

也是可以做到在一個app中創(chuàng)建多個window的懊亡,而且似乎也不會怎么樣。
觸屏事件會根據(jù)觸摸點(diǎn)的位置乎串,被UIApplication分發(fā)到對應(yīng)的window中斋配。


參考

UIWindow Class Reference
Understanding Windows and Screens
iOS開發(fā)UI篇—控制器的創(chuàng)建
關(guān)于UIWindow的一點(diǎn)兒思考
Event Delivery: The Responder Chain

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灌闺,隨后出現(xiàn)的幾起案子艰争,更是在濱河造成了極大的恐慌,老刑警劉巖桂对,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甩卓,死亡現(xiàn)場離奇詭異,居然都是意外死亡蕉斜,警方通過查閱死者的電腦和手機(jī)逾柿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宅此,“玉大人机错,你說我怎么就攤上這事「竿螅” “怎么了弱匪?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長璧亮。 經(jīng)常有香客問我萧诫,道長,這世上最難降的妖魔是什么枝嘶? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任帘饶,我火速辦了婚禮坟桅,結(jié)果婚禮上干签,老公的妹妹穿的比我還像新娘。我一直安慰自己卿樱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布缴饭。 她就那樣靜靜地躺著暑劝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茴扁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天汪疮,我揣著相機(jī)與錄音峭火,去河邊找鬼。 笑死智嚷,一個胖子當(dāng)著我的面吹牛卖丸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盏道,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稍浆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了猜嘱?” 一聲冷哼從身側(cè)響起衅枫,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朗伶,沒想到半個月后弦撩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡论皆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年益楼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片点晴。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡感凤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粒督,到底是詐尸還是另有隱情陪竿,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布屠橄,位于F島的核電站萨惑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仇矾。R本人自食惡果不足惜庸蔼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贮匕。 院中可真熱鬧姐仅,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馒疹,卻和暖如春佳簸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颖变。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工生均, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腥刹。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓马胧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衔峰。 傳聞我的和親對象是個殘疾皇子佩脊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計(jì)數(shù)+1垫卤,想要解決就用__block...
    炙冰閱讀 2,486評論 1 14
  • 7威彰、不使用IB是,下面這樣做有什么問題穴肘? 6抱冷、請說說Layer和View的關(guān)系,以及你是如何使用它們的梢褐。 1.首先...
    AlanGe閱讀 674評論 0 1
  • 騎車20分鐘旺遮,最近沒有休息好,好困啊
    SPP164810閱讀 121評論 0 0
  • http://pan.baidu.com/share/link?shareid=3562246143&uk=218...
    奔跑的馬齒莧閱讀 230評論 0 0
  • js總的來說 1.被所有主流的瀏覽器支持并被大部分網(wǎng)頁使用 2.他可以在網(wǎng)頁上呈現(xiàn)動態(tài)效果 對于js代碼的位置 1...
    tinaaaabbb閱讀 437評論 0 2