iOS-UIStatusBar详细总结

1、UIStatusBar简介

iOS上的statusBar就是指的最上面的20point高的部分,分为两个部分

  • 前景部分:就是指显示信号、时间、电量等的状态部分
  • 后景部分:就是显示黑色或者图片的背景部分

2、UIStatusBar前景

2.1 UIStatusBarStyle

UIStatusBar的前景部分实际就是通过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 默认黑色字体
UIStatusBarStyleLightContent 白色字体

2.2 修改启动页的UIStatusBarStyle

  • 【General】 -->【Deployment Info】-->【Status Bar Style】
    启动页statusBar.png

    此处可设置启动页的statusBarStyle以及hidden属性,Requires full screen在支持分屏多任务时需要勾选。
  • Info.plist处修改


    Info.png

两处修改是同步的,修改其中一处,另一处会随之变化。
此处的修改只针对启动页有效,对viewController不起作用。

2.3 viewController的UIStatusBarStyle

修改viewController的statusBar有两种方式

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

重点强调:
Info.plist里有个View controller-based stats bar appearance属性,没有可以自己添加,默认是YES,表示通过方式一设置的UIStatusBarStyle优先级高于方式二,当设为NO时反之。

2.3.1方式一详解

此时View controller-based stats bar appearance值要为YES,此值默认是YES,Info.plist没添加该属性时,即为YES
主要有五个方法,在ViewController里重写即可。

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

这里说明一下setNeedsStatusBarAppearanceUpdatechildViewControllerForStatusBarStyle两个方法。

  1. - (void)setNeedsStatusBarAppearanceUpdate
    如果在viewController已经显示在当前页面,你可能还要在当前页面不时的更改statusBar的前景色,那么,你首先需要调用下面的setNeedsStatusBarAppearanceUpdate方法(这个方法会通知系统去调用当前UIViewControllerpreferredStatusBarStyle方法),从而改变statusBarstatusBarStyle
    具体用法:
-(void)changeStatsBar {
    _isChange = !_isChange;
    [self setNeedsStatusBarAppearanceUpdate];  
}
-(UIStatusBarStyle)preferredStatusBarStyle {
    return _isChange?UIStatusBarStyleLightContent:UIStatusBarStyleDefault;
}
  1. - (nullable UIViewController *)childViewControllerForStatusBarStyle;
    这个接口也很重要,默认返回值为nil。当我们调用setNeedsStatusBarAppearanceUpdate时,系统会调用application.windowrootViewControllerpreferredStatusBarStyle方法,我们的程序里一般都是用navigationControllerroot,如果是这种情况,那我们自己的viewController里的preferredStatusBarStyle根本不会被调用。这种情况下我们需要在navigationController里重写该方法,返回当前正在显示的viewController.
    如:
-(nullable UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

这里再次强调一下:
当用navigationController做root时,在viewController里重写上述几个方法是无效的,如若单独改变某个viewControllerstatusBarStyle必须在navigationController里重写childViewControllerForStatusBarStyle方法实现

2.3.2方式二详解

首先设置View controller-based stats bar appearance值为NO,否则通过此方式设置的属性都不会生效。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法里设置相关属性方法开更改statusBar的style和hidden

@interface UIApplication(UIApplicationDeprecated)
// 显示设置statusBarOrientation
@property(readwrite, nonatomic) UIInterfaceOrientation statusBarOrientation;
- (void)setStatusBarOrientation:(UIInterfaceOrientation)interfaceOrientation animated:(BOOL)animated;

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

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

@end

通过UIApplication的方式,我们发现在iOS9以后全部都废除了,看来苹果官方并不推荐我们这么做。UIApplication的方式是一种全局控制,这样的方式也确实不怎么好。

3、更改UIStatusBar后景

3.1 默认方式

UIStatusBar的背景默认会显示navigationBar的背景或self.view的背景。所以可以通过修改navigationBarself.view的背景修改statusBar的背景。

  1. 当有navigationBar时,通过下面两个方法修改:
    setBarTintColor
    - (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
    关于navigationBar背景颜色的问题,更加详细的内容可以参考IOS-UINavigationController详解

  2. 没有navigationBar时,通过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;
    }
}

此方法修改过后,如无特别设置,其余所有的statusBar都会该设置后的颜色。

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];
}

只修改当前navigationController的statusBar

参考文章:
ios上 更改 状态栏(UIStatusBar)的颜色,你值得一看、收藏
iOS7下隐藏status bar的详细研究
ios 状态栏statusBar的背景颜色

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容