美文网首页iOS学习笔记iOS Developer自己尝试等装一下
【Objective-c】状态栏UIStatus Bar设置

【Objective-c】状态栏UIStatus Bar设置

作者: MR_詹 | 来源:发表于2016-11-01 09:24 被阅读158次

    项目需求:在VC的顶部添加ImageView,并且该图片要跟状态栏一体


    第一时间的灵感是设置状态栏字体的为白色,接着设置设置状态栏的背景颜色为透明。沿着思路,学习状态栏StatusBar

    首先,状态栏StatusBar分前景色(文字和图案的颜色)、背景色(整条导航栏的颜色)

    前景色

    //前景色就只有黑色和白色可以选择
    //白色
    UIStatusBarStyleLightContent    
    //黑色(默认)
    UIStatusBarStyleDefault
    
    实现方法有两种
    1、plist文件

    在plist列表中添加一行“UIStatusBarStyle“,并设置为上面介绍中一种
    ,这样app在启动launch页面的时候,statusBar显示的就是plist设置的风格

    2、代码实现

    iOS_9.0以下的方式,不管有没有导航栏,只要设置UIStatusBarStyle的方法,并且在plist列表中添加“View controller-based status bar appearance”其值为“NO”都可以更改前景色

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;
    

    iOS_9.0以上版本的,更换了新API,通过调用
    ”- (UIStatusBarStyle)preferredStatusBarStyle“返回需要的样式,但是要注意的是,有导航栏和没导航栏是有区别的
    前提:在plist列表中添加“View controller-based status bar appearance”,并设置为“YES”(是默认值)

    无导航栏

     /** 
        当VC显示的时候就会自动调用这个方法,如果在当前VC不变的时动态改变前景色, 可以通过VC 调动“setNeedsStatusBarAppearanceUpdate”.
    */  
    - (UIStatusBarStyle)preferredStatusBarStyle{
        //statusBar 前景色只有两种选择:
        //黑色(默认的):UIStatusBarStyleDefault
        //白色:UIStatusBarStyleLightContent
        return UIStatusBarStyleLightContent;
    }
    

    有导航栏
    也是使用同样的方法“preferredStatusBarStyle”,但是只是重写这个方法是不行的,打个断点可以发现ViewController不会进入这个方法,这里就要理理调用的

    机制:

    当ViewController 开始显示的时候或者调用setNeedsStatusBarAppearanceUpdate方法,系统会调用widow.rootViewController的“preferredStatusBarStyle”方法,也就是说
    再用导航栏时不会调动ViewController的“preferredStatusBarStyle”,解决的办法是创建一个UINavigationController的类别,并在.m文件中重写“preferredStatusBarStyle”方法,返回值为“self.topViewController”,意思就是由“self.topViewController”调用“preferredStatusBarStyle”方法

    #import "UINavigationController+VCBar.h"
    @implementation UINavigationController (VCBar)
    - (UIViewController *)childViewControllerForStatusBarStyle{
        return self.topViewController;
    }
    @end
    

    背景色

    无导航栏或者导航栏隐藏时,statusBar的背景色默认是跟VC的根视图背景色一致
    有导航栏时,状态栏背景色默认是跟导航栏一直的

    单独设置导航栏颜色

        //获取状态栏,设置背景色
        UIView *statusBar = [[[UIApplication sharedApplication]valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
        if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
            statusBar.backgroundColor = color;
        }
    
    要实现上面的效果,只需要导航栏隐藏,并且将ImageView的y坐标设置为-20即可
    总结:

    “[UIApplication sharedApplication].statusBarStyle ” 只有在“View controller-based status bar appearance”值为“NO”才有效,并且是全局有效。

    “- (UIStatusBarStyle)preferredStatusBarStyle” 只有在“View controller-based status bar appearance”值为“YES”才有有效(默认值是YES),并且只是设置当前的状态栏,所以必须每个VC设置。

    感谢博文:
    https://my.oschina.net/shede333/blog/304560
    http://www.jianshu.com/p/5c09c2700038

    相关文章

      网友评论

        本文标题: 【Objective-c】状态栏UIStatus Bar设置

        本文链接:https://www.haomeiwen.com/subject/gxaputtx.html