iOS UI 任意變更StatusBar背景顏色

任意變更StatusBar背景顏色

iOS 7問世之後,改變iOS整個UI設計,在畫面呈現上面也變的不同,尤其是StatusBar背景顏色會隨著您APP背景顏色所改變,言下之意也能理解成StatusBar由文字所表達,您可以籍由setStatusBarStyle指定是黑色字UIStatusBarStyleDefault或是白色字UIStatusBarStyleLightContent,但你想要維持原本的黑底色或其他底色而不被APP背景所影響時該怎麼處理?接下來會告訴您怎麼做,但要記得這只會在iOS 7以後本版才有效用。

變更Xcode Info設定

如果您要使用暗色系當背景底色時,可能您會選擇白色字的StatusBar文字,那您需要變更StatusBarStyle設定,因後期與前期Xcode設定方式不同,要可容以前的做法時,需要在Info.plist中增加設定讓Xcode在編譯時能接受舊語法:

首先在Info資訊中Custom Ios Target Properties建立新的Key值View controller-based status bar appearance並將Value值選擇NO,如此一來就能接受用程式來設定物件全域性的設定,像[UIApplication sharedApplication],或是改變預設值,讓每個StoryBoard的StatusBar預設值是一樣的:

增加程式碼

iOS APP啟動時會利用AppDelegate來完成一些相關初始化動作,建立一個Windows後再載入ViewController讓使用者看到第一個畫面,不過一些細節已經被隱藏,在早些版本的Xcode還能看到一些原理,不過每當初始化完成要開始Load第一個ViewController時會先呼叫didFinishLaunchingWithOptions,所以將要處理的程式碼寫在這。

//-----------start-----------
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    //設定StatusBarStyle為白色文字表示
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.window.frame.size.width,20)];
    label.backgroundColor = [UIColor blackColor];
    //建立一個Label並且為全黑底色,高度20px,寬度與整個window同寬
    [self.window.rootViewController.view addSubview:label];
    self.window.backgroundColor = [UIColor blackColor];
    return YES;
}
//------------end------------

原理

iOS 7在完成每一個畫面時是以圖層(Layer)概念一層一層堆疊讓使用者看到最終的畫面,以StatusBar情況下,它會被以文字的方式疊在View Controller畫面最上一層,所以當didFinishLaunchingWithOptions被呼叫時加入一個Label View讓它在能保持之後被載入的View Controller的上層,如此原理就能讓StatusBar的背景以你先加入的Label的背景為主。

當你增加Navigation功能時也能因為這樣的方式可以讓StatusBar保持自已的底色: