iOS-UIStatusBar詳細(xì)總結(jié)

1、UIStatusBar簡(jiǎn)介

iOS上的statusBar就是指的最上面的20point高的部分,分為兩個(gè)部分

  • 前景部分:就是指顯示信號(hào)、時(shí)間、電量等的狀態(tài)部分
  • 后景部分:就是顯示黑色或者圖片的背景部分

2、UIStatusBar前景

2.1 UIStatusBarStyle

UIStatusBar的前景部分實(shí)際就是通過UIStatusBarStyle來修改,iOS7之后就兩種style,

typedef NS_ENUM(NSInteger, UIStatusBarStyle) {
    UIStatusBarStyleDefault                                     = 0, // Dark content, for use on light backgrounds
    UIStatusBarStyleLightContent     NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds
    
    UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
    UIStatusBarStyleBlackOpaque      NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
}

UIStatusBarStyleDefault 默認(rèn)黑色字體
UIStatusBarStyleLightContent 白色字體

2.2 修改啟動(dòng)頁(yè)的UIStatusBarStyle

  • 【General】 -->【Deployment Info】-->【Status Bar Style】
    啟動(dòng)頁(yè)statusBar.png

    此處可設(shè)置啟動(dòng)頁(yè)的statusBarStyle以及hidden屬性,Requires full screen在支持分屏多任務(wù)時(shí)需要勾選。
  • Info.plist處修改


    Info.png

兩處修改是同步的,修改其中一處,另一處會(huì)隨之變化。
此處的修改只針對(duì)啟動(dòng)頁(yè)有效,對(duì)viewController不起作用。

2.3 viewController的UIStatusBarStyle

修改viewController的statusBar有兩種方式

  • 方式一:通過viewController的-(UIStatusBarStyle)preferredStatusBarStyle方法
  • 方式二:通過UIApplication的方式

重點(diǎn)強(qiáng)調(diào):
Info.plist里有個(gè)View controller-based stats bar appearance屬性,沒有可以自己添加,默認(rèn)是YES,表示通過方式一設(shè)置的UIStatusBarStyle優(yōu)先級(jí)高于方式二,當(dāng)設(shè)為NO時(shí)反之。

2.3.1方式一詳解

此時(shí)View controller-based stats bar appearance值要為YES,此值默認(rèn)是YES,Info.plist沒添加該屬性時(shí),即為YES
主要有五個(gè)方法,在ViewController里重寫即可。

//返回statusBarStyle
- (UIStatusBarStyle)preferredStatusBarStyle
//返回是否Hidden
- (BOOL)prefersStatusBarHidden
//更新statusBarStyle
- (void)setNeedsStatusBarAppearanceUpdate
//
- (nullable UIViewController *)childViewControllerForStatusBarStyle;
- (nullable UIViewController *)childViewControllerForStatusBarHidden;

這里說明一下setNeedsStatusBarAppearanceUpdatechildViewControllerForStatusBarStyle兩個(gè)方法。

  1. - (void)setNeedsStatusBarAppearanceUpdate
    如果在viewController已經(jīng)顯示在當(dāng)前頁(yè)面,你可能還要在當(dāng)前頁(yè)面不時(shí)的更改statusBar的前景色,那么,你首先需要調(diào)用下面的setNeedsStatusBarAppearanceUpdate方法(這個(gè)方法會(huì)通知系統(tǒng)去調(diào)用當(dāng)前UIViewControllerpreferredStatusBarStyle方法),從而改變statusBarstatusBarStyle
    具體用法:
-(void)changeStatsBar {
    _isChange = !_isChange;
    [self setNeedsStatusBarAppearanceUpdate];  
}
-(UIStatusBarStyle)preferredStatusBarStyle {
    return _isChange?UIStatusBarStyleLightContent:UIStatusBarStyleDefault;
}
  1. - (nullable UIViewController *)childViewControllerForStatusBarStyle;
    這個(gè)接口也很重要,默認(rèn)返回值為nil。當(dāng)我們調(diào)用setNeedsStatusBarAppearanceUpdate時(shí),系統(tǒng)會(huì)調(diào)用application.windowrootViewControllerpreferredStatusBarStyle方法,我們的程序里一般都是用navigationControllerroot,如果是這種情況,那我們自己的viewController里的preferredStatusBarStyle根本不會(huì)被調(diào)用。這種情況下我們需要在navigationController里重寫該方法,返回當(dāng)前正在顯示的viewController.
    如:
-(nullable UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

這里再次強(qiáng)調(diào)一下:
當(dāng)用navigationController做root時(shí),在viewController里重寫上述幾個(gè)方法是無效的,如若單獨(dú)改變某個(gè)viewControllerstatusBarStyle必須在navigationController里重寫childViewControllerForStatusBarStyle方法實(shí)現(xiàn)

2.3.2方式二詳解

首先設(shè)置View controller-based stats bar appearance值為NO,否則通過此方式設(shè)置的屬性都不會(huì)生效。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法里設(shè)置相關(guān)屬性方法開更改statusBar的style和hidden

@interface UIApplication(UIApplicationDeprecated)
// 顯示設(shè)置statusBarOrientation
@property(readwrite, nonatomic) UIInterfaceOrientation statusBarOrientation;
- (void)setStatusBarOrientation:(UIInterfaceOrientation)interfaceOrientation animated:(BOOL)animated;

// 設(shè)置statusBarStyle
@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle;
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated;

//設(shè)置statusBarHidden
@property(readwrite, nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation;

@end

通過UIApplication的方式,我們發(fā)現(xiàn)在iOS9以后全部都廢除了,看來蘋果官方并不推薦我們這么做。UIApplication的方式是一種全局控制,這樣的方式也確實(shí)不怎么好。

3、更改UIStatusBar后景

3.1 默認(rèn)方式

UIStatusBar的背景默認(rèn)會(huì)顯示navigationBar的背景或self.view的背景。所以可以通過修改navigationBarself.view的背景修改statusBar的背景。

  1. 當(dāng)有navigationBar時(shí),通過下面兩個(gè)方法修改:
    setBarTintColor
    - (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
    關(guān)于navigationBar背景顏色的問題,更加詳細(xì)的內(nèi)容可以參考IOS-UINavigationController詳解

  2. 沒有navigationBar時(shí),通過self.view.backgroundColor修改。

3.2 KVO的方式修改

方法如下:

-(void)setStatusBarBackgroundColor:(UIColor *)color {
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
    NSLog(@"statusBar.backgroundColor--->%@",statusBar.backgroundColor);
    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = color;
    }
}

此方法修改過后,如無特別設(shè)置,其余所有的statusBar都會(huì)該設(shè)置后的顏色。

3.3 UIView覆蓋statusBar的方式

方法如下:

-(void)setStatusBarBackgroundColor:(UIColor *)color {
    UIView * statusBarView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, -20)];
    statusBarView.backgroundColor = [UIColor orangeColor];
    [self.navigationController.navigationBar addSubview:statusBarView];
}

只修改當(dāng)前navigationController的statusBar

參考文章:
ios上 更改 狀態(tài)欄(UIStatusBar)的顏色,你值得一看、收藏
iOS7下隱藏status bar的詳細(xì)研究
ios 狀態(tài)欄statusBar的背景顏色

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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