1. 程式人生 > >iOS讓檢視View覆蓋狀態列statusBar(即View顯示在statusBar的前面),不是隱藏statusBar

iOS讓檢視View覆蓋狀態列statusBar(即View顯示在statusBar的前面),不是隱藏statusBar

專案需求,需要新建一個View,半透明的覆蓋整個螢幕,包括statusBar。如果直接在keyWindow上面addSubView,是不行的,statusBar仍然顯示在最前面。
這裡需要新建一個UIWindow,並且要設定windowLevel > UIWindowLevelStatusBar,這樣才能顯示在statusBar的前面。程式碼如下:

    CHQSpeechView *view = [[CHQSpeechView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    static UIWindow *newWindow;     // 加static的目的是讓區域性變數不要被釋放掉
if (newWindow == nil) { newWindow = [[UIWindow alloc] initWithFrame:view.bounds]; } newWindow.windowLevel = UIWindowLevelStatusBar + 100; // 大於UIWindowLevelStatusBar將會顯示在statusBar的前面,後面隱藏的時候,需要將此值改為小於UIWindowLevelNormal [newWindow addSubview:view]; [newWindow makeKeyAndVisible]; // 作為關鍵Window並且顯示,後面注意要把keyWindow替換回去,不然會影響正常的window的工作

這樣子操作後,view就會顯示在statusBar的前面了。當要移除view時,注意要將keyWindow改回去,並且將newWindow的windowLevel設定為 < UIWindowLevelNormal。程式碼如下:

    [[UIApplication sharedApplication].windows[0] makeKeyAndVisible];   // 將keyWindow替換為原來的window
    view.window.windowLevel = UIWindowLevelNormal - 1;  // 設定windows的windowLevel小於UIWindowLevelNormal
[view removeFromSuperview]; // 從window中移除檢視

當然,你的程式碼可能會和我不一樣,但是思路是一樣的:
1、新建window
2、設定window的windowLevel > UIWindowLevelStatusBar
3、將要顯示的View新增到新的window上面
4、新window呼叫makeKeyAndVisible
移除的時候:
1、將keyWindow換回去
2、設定新window的windowLevel < UIWindowLevelNormal
3、從新window中移除view