美文网首页
功能-状态栏statusBar的相关设置

功能-状态栏statusBar的相关设置

作者: 才寒 | 来源:发表于2016-03-29 15:29 被阅读390次

    设置statusBar的前景部分

    状态栏类型:

    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,
    } __TVOS_PROHIBITED;
    

    状态栏修改方式:

    • plist设置

      在plist添加一行UIStatusBarStyle(或Status bar style),值可以是

      • UIStatusBarStyleDefault
      • UIStatusBarStyleLightContent

      设置后app启动的launch页显示的时候,statusBar的样式就是上面plist设置的风格.

    • 代码设置

      • iOS 2.0 ~ 9.0

          [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 
        
        [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
        
    • iOS 7.0 ~

      Tag:

      UIViewcontroller或者UINavigationController都是控制器,下面统一叫它们控制器。

      状态栏statusBar是属于UIApplication的一个UI,也就是说一个app只有一个状态栏,并不是每一个控制器都拥有的属性,所以在控制器中通过preferredStatusBarStyle方法修改的状态栏样式不一定有用,只有当该控制器是当前app的控制者的时候,状态栏的样式才会听命于这个控制器。

      一般我们都是写一个UINavigationController作为window的rootViewController,其它的控制器都是在UINavigationController的管理下,app的控制权一直在UINavigationController手中,所以状态栏的样式只听命于这个UINavigationController。

      由此我们得出一种控制状态栏风格的方法,自定义一个UINavigationController,在自定义UINavigationController中实现preferredStatusBarStyle方法指定状态栏样式,只要更改这个自定义类中preferredStatusBarStyle方法里的值,就能更改状态栏的风格。

      如果要让这个UINavigationController管理的所有控制器也能通过preferredStatusBarStyle方法更改状态栏风格,可以通过childViewControllerForStatusBarStyle方法出借更改权限给指定的控制器,代码如下:

      - (UIViewController *)childViewControllerForStatusBarStyle{
              return self.topViewController;
       }
      

      这样在UINavigationController管理栈中的栈顶控制器就有权限控制器状态栏了。

      除此之外,我们也可以用模态跳转的方式来控制器与控制器之间的跳转,这种情况下每个控制器都有权限控制状态栏风格。

      [self presentViewController:vc animated:YES completion:^{}];
      


      指定当前控制器的状态栏风格

       - (UIStatusBarStyle)preferredStatusBarStyle;
      


      指定当前控制器的子控制器读取谁的状态栏样式,当返回nil时,默认读取自身设置的状态栏样式

        - (UIViewController *)childViewControllerForStatusBarStyle;  
      

      调用该方法,调用当前拥有控制权的控制器的 -preferredStatusBarStyle方法刷新状态栏风格

        - (void)setNeedsStatusBarAppearanceUpdate;
      

    设置statusBar的【背景部分】

    • iOS 7.0之前 通过tintColor修改
    • iOS 7.0之后 通过barTintColor修改

    如果调用了以下方法,barTintColor将无效

    - (void)setBackgroundImage:(nullable UIImage *)backgroundImage forBarPosition:(UIBarPosition)barPosition barMetrics:(UIBarMetrics)barMetrics 
    NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR;
          ```

    相关文章

      网友评论

          本文标题:功能-状态栏statusBar的相关设置

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