V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tunnyios
V2EX  ›  iOS

iOS 状态栏 StatusBar 的相关使用

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

    希望大家可以關注一下我的個人博客 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   ·   实用小工具   ·   5840 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:29 · PVG 10:29 · LAX 18:29 · JFK 21:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.