iOS状态栏(UIStatusBar)总结

在项目中遇到有关状态栏样式的问题,于是查阅了相关资料,总结了一下。希望对其他简友们遇到相似的问题时有所帮助。有描述不对或者该补充的地方,也请各位多多指教。本文结构分两部分,第一部分为场景+设置方法;第二部分为相关的背景知识。

第一部分


场景一:
  1. 统一启动页和启动页之后的视图控制器状态栏内容样式为白色或黑色。
设置方式1:

进入XcodeTargets->General->DeploymentInfo->Status Bar Style,设置其值为Default时,状态栏样式为黑色;设置其值为Light时,状态栏样式为白色。

设置方式2:

info.plist文件中,找到Status bar style键,设置其值为Gray style (default)时,状态栏样式为黑色;设置其值为UIStatusBarStyleLightContent时,状态栏样式为白色。


场景二:
  1. 整个应用程序状态栏样式统一为白色或黑色。
设置方式:
  1. info.plist文件中添加 UIViewControllerBasedStatusBarAppearance键,并设置其值为NO。

  2. 在程序启动的地方设置,如下所示:

     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
         // Override point for customization after application launch.    
       // 这种设置方式在iOS9之后废弃,采用 -[UIViewController preferredStatusBarStyle]
       [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; //统一状态栏样式为白色
       //[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; // 统一状态栏样式为黑色
    
       return YES;
     }
    

场景三:
  1. 整个应用程序状态栏样式不统一。状态栏样式由各界面的视图控制器决定。
情况一:
  1. 该界面没有导航控制器
设置方式:
  1. info.plist文件中添加 UIViewControllerBasedStatusBarAppearance键,并设置其值为YES。或者删除UIViewControllerBasedStatusBarAppearance键。

  2. 在视图控制器中重写方法如下所示:

     - (UIStatusBarStyle)preferredStatusBarStyle {
       return UIStatusBarStyleLightContent;// 该控制器下的状态栏样式为白色
       // return UIStatusBarStyleDefault;// 该控制器下的状态栏样式为黑色
     }
    
情况二:
  1. 该界面有导航控制器
设置方式:
  1. info.plist文件中添加 UIViewControllerBasedStatusBarAppearance键,并设置其值为YES。或者删除UIViewControllerBasedStatusBarAppearance键。

  2. 添加UINavigationController的分类(使用继承也可以),在分类中重写方法如下所示

     - (UIViewController *)childViewControllerForStatusBarStyle {
       return self.topViewController; // 返回导航控制器栈顶视图控制器,即当前显示的控制器。
     }
    
  3. 在当前显示的视图控制器中,重写方法如下所示

     - (UIStatusBarStyle)preferredStatusBarStyle {
       return UIStatusBarStyleLightContent;// 该控制器下的状态栏样式为白色
       // return UIStatusBarStyleDefault;// 该控制器下的状态栏样式为黑色
     }
    


第二部分

  1. 状态栏(UIStatusBar)的视图层级结构:
使用Reveal查看的结果

层级结构上分为背景视图部分和前景视图部分,前景视图部分包含无限网络连接标识,时间标识,蓝牙状态标识,电池电量标识等等可见内容。修改状态栏内容样式即改变前景视图内容的颜色,分为白色和黑色两种,白色样式主要用于界面背景为黑色的时候,黑色样式主要用于界面背景为浅色的时候。

  1. 关于前文中提到的UIViewControllerBasedStatusBarAppearance键:
    官方文档关于此键的描述如下

UIViewControllerBasedStatusBarAppearance (Boolean - iOS) Specifies whether the status bar appearance is based on the style preferred by the view controller that is currently under the status bar. When this key is not present or its value is set to YES, the view controller determines the status bar style. When the key is set to NO, view controllers (or the app) must each set the status bar style explicitly using the UIApplication object.

This key is supported in iOS 7.0 and later.

翻译:指定状态栏的外观是否基于当前位于状态栏下的控制器的优选样式。当此键不存在或者其值设置为YES时,由控制器来决定状态栏样式。当此键的值设置为NO时,视图控制器(或应用程序)必须显示的使用UIApplication对象显示地设置状态栏样式。

当这个键设置为NO时,只能由UIApplication对象来控制状态栏样式。当设置为YES或不存在时,才能够使用控制器对象来控制状态栏样式。

  1. 关于前文中提到的childViewControllerForStatusBarStyle:
    官方文档的描述如下:

Called when the system needs the view controller to use for determining status bar style.
If your container view controller derives its status bar style from one of its child view controllers, implement this method and return that child view controller. If you return nil or do not override this method, the status bar style for self is used. If the return value from this method changes, call the setNeedsStatusBarAppearanceUpdate method.

翻译:当系统需要视图控制器用于确定状态栏样式时调用。如果您的容器视图控制器从其子视图控制器中导出其状态栏样式,请执行此方法并返回该子视图控制器。 如果返回nil或不覆盖此方法,则会使用自身的状态栏样式。 如果此方法的返回值更改,请调用setNeedsStatusBarAppearanceUpdate方法。

当有导航控制器的时候,如果导航控制器的该方法返回nil,系统会调用导航控制器的preferredStatusBarStyle方法取到返回值,来决定状态栏样式。在导航控制器的该方法中返回子视图控制器,则系统会调用其子视图控制器的preferredStatusBarStyle方法来取到返回值,来决定状态栏样式。

  1. 关于上面提到的setNeedsStatusBarAppearanceUpdate:
    官方文档的描述如下:

Indicates to the system that the view controller status bar attributes have changed.
Call this method if the view controller's status bar attributes, such as hidden/unhidden status or style, change. If you call this method within an animation block, the changes are animated along with the rest of the animation block.

翻译:向系统指示视图控制器状态栏属性已更改。如果视图控制器的状态栏属性(如隐藏/未隐藏状态或样式)发生更改,请调用此方法。 如果您在动画块中调用此方法,那么更改将与动画块的其余部分一起动画。

调用此方法会重写调用前面的childViewControllerForStatusBarStylepreferredStatusBarStyle方法来重置一次状态栏。当想要主动改变状态栏样式时,可以主动调用此方法来重置状态栏样式。

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

推荐阅读更多精彩内容