美文网首页
IOS中有关状态栏的设置

IOS中有关状态栏的设置

作者: 香菜那么好吃为什么不吃香菜 | 来源:发表于2020-08-04 15:09 被阅读0次

    我们先来说一下相关的数据

    View controller-based status bar appearance

    在项目的info.plist文件里的View controller-based status bar appearance为BOOL型,默认为YES。
    当为yes的时候,VC对status bar的属性设置的优先级高于app,可以在各个UIViewController中控制控制状态栏的颜色和状态;当为NO的时候,APP对status bar的属性设置的优先级高于VC,全局设置status tar的颜色和状态,VC设置状态栏preferStatusBarHidden是无效的根本不会被调用。

    方法一(IOS9.0+之后不建议使用,可能会有警告)

    设置

    将info.plist中的View controller-based status bar appearance设置为NO(若没有这个key,直接插入再设置为NO),否。
    [[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
    我们点进去看api的时候发现如下说明

    // Setting the statusBarStyle does nothing if your application is using 
    //the default UIViewController-based status bar system.
    
    @property(readwrite,nonatomic)UIStatusBarStyle statusBarStyle 
    NS_DEPRECATED_IOS(2_0,9_0,"Use -[UIViewController preferredStatusBarStyle]");
    
    - (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated 
    NS_DEPRECATED_IOS(2_0,9_0,"Use -[UIViewController preferredStatusBarStyle]");
    

    方法二

    设置

    将info.plist中的View controller-based status bar appearance设置为YES,默认值就是YES;如果plist中没有这个key,该方式亦可生效。

    实现方法

    preferredStatusBarStyle

    - (UIStatusBarStyle)preferredStatusBarStyle
    在需要的控制器里面重写这个方法,返回值就是UIStatusBarStyleDefault、UIStatusBarStyleLightContent或者UIStatusBarStyleDarkContent。

    childViewControllerForStatusBarStyle

    - (UIViewController *)childViewControllerForStatusBarStyle:

    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.
    我们可以给UINavigationController以及UITabBarController写一个catogory,implementation如下:

    //
     @implementation UINavigationController (OLStatusBarStyle)
    - (UIViewController *)childViewControllerForStatusBarStyle{
      return  self.topViewController;
    }
    - (UIViewController *)childViewControllerForStatusBarHidden{
      return self.topViewController;
    }
    
     @implementation UITabBarController (OLStatusBarStyle)
    - (UIViewController *)childViewControllerForStatusBarStyle{
      return  self.selectedViewController;
    }
    - (UIViewController *)childViewControllerForStatusBarHidden{
      return self.selectedViewController;
    }
    

    扩展中重写了这两个方法,意味着不再调用container(NavigationController或者UITabBarController)的preferredStatusBarStyle这个方法,而是调用self.topViewController/ self.selectedViewControlle的preferredStatusBarStyle,那么我们重写的preferredStatusBarStyle就会被调用,就能更改status bar的颜色了。

    只要UIViewController重写的childViewControllerForStatusBarStyle返回值不是nil,那么UIViewcontroller的preferredStatusBarStyle方法不会被系统的Container(NavigationController或者UITabBarController)调用,而是调用childViewControllerForStatusBarStyle返回的UIViewController的preferredStatusBarStyle来控制StatuBar的颜色。

    相关文章

      网友评论

          本文标题:IOS中有关状态栏的设置

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