iOS-UIStatusBar详细总结

作者: MrJ的杂货铺 | 来源:发表于2017-02-22 16:07 被阅读1101次

    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的背景颜色

    相关文章

      网友评论

        本文标题:iOS-UIStatusBar详细总结

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