iOS 状态栏 StatusBar 的相关使用 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tunnyios
V2EX    iOS

iOS 状态栏 StatusBar 的相关使用

  •  
  •   tunnyios 2015-12-03 23:34:18 +08:00 3737 次点击
    这是一个创建于 3600 天前的主题,其中的信息可能已经有所发展或是发生改变。

    希望大家可以注一下我的人博客 www.tunnycoder.com

    iOS 状态栏 StatusBar 的相关使用

    最近在改公司的就项目,遇到了引用一些第三方框架,但是框架修改了状态栏的属性。由于是旧项目,代码很是臃肿,导致改了多处才搞定。故此总结一下 iOS 状态栏 StatusBar 相关技巧。
    <!--more-->

    设置 StatusBar

    IOS7 之后,系统提供了 2 种管理状态栏的方式:

    1> 通过 UIViewController 管理(每一个 UIViewController 都可以拥有自己不同的状态栏) 2> 通过 UIApplication 管理(一个应用程序的状态栏都由它来统一管理) 

    PS : IOS7 中,默认情况下,状态栏都是由 UIViewController 管理的。但是一般都是交给 UIApplication 来管理

    设置控制器管理 StatusBar /设置 UIApplication 管理状态栏

    首先得修改 Info.plist 的设置:

    1. View controller-based status bar appearance YES; 则 View controller 对 status bar 的设置优先级高于 application 的设置; 2. View controller-based status bar appearance NO; 则以 application 的设置为准; 

    UIApplication 中设置状态栏的相关方法

    直接在 Application 代理中设置:

    application.statusBarHidden = NO; application.statusBarStyle = UIStatusBarStyleLightContent; 

    控制器中设置状态栏的相关方法

    状态栏的相关方法:(在控制器中实现)

    //设置状态栏隐藏 - (BOOL)prefersStatusBarHidden { return YES; } //调整状态栏 - (UIStatusBarStyle)preferredStatusBarStyle { //Dark content, for use on light backgrounds //在亮背景上显示黑内容 return UIStatusBarStyleDefault; //Light content, for use on dark backgrounds //在黑背景上,显示亮内容 // return UIStatusBarStyleLightContent; } 

    控制器设置状态栏要注意的问题

    如果出现设置了View controller-based status bar appearance YES;,但是设置状态栏的相关方法不执行。则有可能的原因是: viewController 是添加到导航上的。

    UINavigationController 不会将 preferredStatusBarStyle 方法调用转给它的子视图,而是由它自己管理状态,而且它也应该那样做.因为 UINavigationController 包含了它自己的状态栏。因此就算 UINavigationController 中的 viewController 实现了preferredStatusBarStyle()方法 也不会被调用。

    因此如果控制器是添加在 UINavigationController 上的,它是基于它的UINavigationBar.barStyle属性。也就是说,如果 viewController 是在导航中的,想要改变状态栏文本颜色,那么需要通过代码:

    //将 status bar 文本颜色设置为白色 self.navigationController.navigationBar.barStyle = UIBarStyleBlack; //将 status bar 文本颜色设置为黑色 ,默认就是黑色 self.navigationController.navigationBar.barStyle = UIBarStyleDefault; 

    此外,如果 viewController 在导航控制器中,还想通过 preferredStatusBarStyle 方法设置状态栏文本颜色,那就只能隐藏导航栏了:

    //隐藏导航栏后 系统会调用 preferredStatusBarStyle 方法
    self.navigationController.navigatiOnBarHidden= YES;

    7 条回复    2015-12-04 10:48:48 +08:00
    loveuqian
        1
    loveuqian  
       2015-12-03 23:55:44 +08:00
    讲的太浅啦。。我之前遇到的状态栏问题都没有说
    xi_lin
        2
    xi_lin  
       2015-12-04 00:00:45 +08:00
    不知道有没有办法在同一个 ViewController 里滚动的时候变化 status bar 的颜色?
    a412739861
        3
    a412739861  
       2015-12-04 00:09:29 +08:00 via iPhone
    @xi_lin 调用一个函数, setxxneedxxxupdate ,然后,在上面两个状态返回值里面加判断。
    手机没补全,真的是一点打不出来…白天再打…
    IamJ
        4
    IamJ  
       2015-12-04 01:01:21 +08:00
    楼上说的是 setNeedsStatusBarAppearanceUpdate
    tunnyios
        5
    tunnyios  
    OP
       2015-12-04 09:10:28 +08:00
    @loveuqian 还有哪些呢?我也想学习学习
    loveuqian
        6
    loveuqian  
       2015-12-04 09:27:32 +08:00
    @tunnyios
    之前遇到 2 个问题
    1.我建了一个透明高 20 的 window 挡在状态栏处,想点击这个 window 就自动将当前显示的 scrollView 包括子类返回顶部,但是状态不见了
    2.我在用动画切换 keyWindow 的根控制器时,状态栏也不见了
    这问题虽然我都解决了。但都是不知道具体原因是什么
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2656 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 14:54 PVG 22:54 LAX 07:54 JFK 10:54
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86