UIWindow的使用,以及需要注意的坑

自定義創(chuàng)建Window

UIWindow是UIView的子類,UIView對(duì)象是通過方法addSubview:顯示到父視圖吕世,但是window卻不需要這樣就能顯示,只需要設(shè)置hidden為NO即可,實(shí)際中一個(gè)window對(duì)象真正顯示到屏幕上還受到windowLevel影響

self.window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 400, 150, 150)];
UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor redColor];
self.window1.rootViewController = vc1;
self.window1.windowLevel = 9;
[self.window1 makeKeyAndVisible];

  • 注意: [window makeKeyWindow];
    window.hidden = NO;
    等價(jià)與
    [self.window2 makeKeyAndVisible];

一個(gè)屏幕可以顯示幾個(gè)window斋荞?

理論上個(gè)數(shù)不限制,按需顯示虐秦。屏幕頂部的狀態(tài)欄平酿、alert彈窗、鍵盤都是常見的window悦陋。

與window相關(guān)的幾個(gè)知識(shí)點(diǎn)

1. windowLevel屬性

默認(rèn)值0.0染服,即系統(tǒng)定義的UIWindowLevelNormal。系統(tǒng)總共定義三種level叨恨,即如下

UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal = 0.f;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert = 2000.f;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar API_UNAVAILABLE(tvos) = 1000.f;

level越高在屏幕上顯示層級(jí)越靠前,如果多個(gè)window設(shè)置相同的level,這時(shí)顯示的層級(jí)就和設(shè)置hidden=NO的順序有關(guān)柳刮,最后設(shè)置的會(huì)顯示在最上層。

2. keyWindow

實(shí)際開發(fā)中我們常常會(huì)把一些顯示級(jí)別高或者全局顯示的視圖放到keyWindow痒钝,通過[UIApplication sharedApplication].keyWindow獲取使用秉颗。那keyWindow是什么,和其他window有什么不同送矩?keyWindow即主窗口蚕甥,參考官方文檔說明,在程序運(yùn)行期間只會(huì)存在一個(gè)主窗口栋荸,而且主窗口可以接收鍵盤事件及非觸摸事件菇怀。接收鍵盤事件好理解凭舶,什么是非觸摸事件呢?原文有相關(guān)描述

Whereas touch events are delivered to the window in which the touch occurred, events that don’t have an associated coordinate value are delivered to the key window.

英文能力有限爱沟,姑且理解為觸摸事件傳遞到當(dāng)前觸摸的window帅霜,同時(shí)會(huì)把這個(gè)觸摸事件傳遞到主窗口,但這個(gè)觸摸事件傳遞時(shí)不會(huì)帶著與坐標(biāo)系相關(guān)的值呼伸。這里非觸摸即沒有touch主窗口身冀,但依然可以接收到觸摸事件。
事實(shí)上任何window都可以設(shè)置為keyWindow括享,如果只是使用自定window展示alert信息或者toast信息搂根,沒有必要設(shè)置;如果alert里需要輸入信息铃辖,那就必須設(shè)置剩愧。
設(shè)置keyWindow的方法有兩個(gè),即

- (void)makeKeyWindow;
- (void)makeKeyAndVisible; 

UIApplication.sharedApplication.delegate.window和UIApplication.sharedApplication.keyWindow有什么區(qū)別娇斩?

  1. [UIApplication sharedApplication].keyWindow
    是設(shè)備上當(dāng)前正在顯示的窗口隙咸。這通常是您應(yīng)用程序的窗口,但也可能是系統(tǒng)窗口
  2. [UIApplication sharedApplication].delegate.window
    是AppDelegate中定義的屬性窗口,是主window;
    @property (strong, nonatomic) UIWindow *window;
  3. [UIApplication sharedApplication].windows.firstObject
    等價(jià)于
    [UIApplication sharedApplication].delegate.window
  4. [UIApplication sharedApplication].windows.lastObject
  5. [[UIApplication sharedApplication]windows].lastObject
    用來獲取當(dāng)前屏幕上最上層的一個(gè)UIWindow成洗,但有可能不是當(dāng)前的window
- (void)alertView {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"測(cè)試" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"確認(rèn)", nil];
    [alertView show];
    
//    UIWindow *window = [UIApplication sharedApplication].keyWindow; //是上面alert的window
    UIWindow *window = [UIApplication sharedApplication].delegate.window;// 是AppDelegate中定義的屬性窗口
    UILabel *tempLabel =[[UILabel alloc]initWithFrame:CGRectMake(150, 150, 100, 20)];
    tempLabel.font = [UIFont systemFontOfSize:16];
    tempLabel.backgroundColor = [UIColor purpleColor];
    tempLabel.text = @"測(cè)試window";
    
    [window addSubview:tempLabel];
    
}
  • 注意:UIWindow *window = [UIApplication sharedApplication].keyWindow,如果使用這個(gè)的時(shí)候,下面的tempLabel就會(huì)添加到UIAlertView所在的_UIAlertControllerShimPresenterWindow層,當(dāng)alert消失的時(shí)候,對(duì)應(yīng)的windows和tempLabel都會(huì)釋放

總結(jié):

https://developer.apple.com/documentation/uikit/uiwindow?language=objc
官方參考文檔 - 《Multiple Display Programming Guide for iOS》Understanding Windows and Screens

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末锨推,一起剝皮案震驚了整個(gè)濱河市稀蟋,隨后出現(xiàn)的幾起案子门驾,更是在濱河造成了極大的恐慌位谋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遥椿,死亡現(xiàn)場(chǎng)離奇詭異基矮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冠场,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門家浇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碴裙,你說我怎么就攤上這事钢悲。” “怎么了舔株?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵莺琳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我载慈,道長(zhǎng)惭等,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任办铡,我火速辦了婚禮辞做,結(jié)果婚禮上琳要,老公的妹妹穿的比我還像新娘。我一直安慰自己秤茅,他們只是感情好稚补,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫂伞,像睡著了一般孔厉。 火紅的嫁衣襯著肌膚如雪拯钻。 梳的紋絲不亂的頭發(fā)上帖努,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音粪般,去河邊找鬼拼余。 笑死,一個(gè)胖子當(dāng)著我的面吹牛亩歹,可吹牛的內(nèi)容都是我干的匙监。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼小作,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼亭姥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顾稀,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤达罗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后静秆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粮揉,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年抚笔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扶认。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡殊橙,死狀恐怖辐宾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膨蛮,我是刑警寧澤螃概,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸽疾,受9級(jí)特大地震影響吊洼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜制肮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一冒窍、第九天 我趴在偏房一處隱蔽的房頂上張望递沪。 院中可真熱鬧,春花似錦综液、人聲如沸款慨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩奠。三九已至,卻和暖如春附帽,著一層夾襖步出監(jiān)牢的瞬間埠戳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工蕉扮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留整胃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓喳钟,卻偏偏與公主長(zhǎng)得像屁使,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奔则,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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