iOS-状态栏的控制(iPhoneX)

作者: 树下敲代码的超人 | 来源:发表于2018-05-07 20:06 被阅读7859次

    技 术 文 章 / 超 人


    以下内容在iPhone X和其他设备都试过。

    关于状态栏有3种不同情况:
    iPhone X :状态栏高度为44
    iOS 11以上 :状态栏高度为20,增加了SafeArea安全区域来判断状态栏高度
    iOS 11以下 :状态栏高度为20,一般判断时直接判断状态栏高度为20

    iPhone X的safeArea区别

    注意点1:iOS11以上,当navigationController没有导航栏时,SafeArea的top就是状态栏的高度
    注意点2:在iOS11以上获取SafeArea的值,一般在viewSafeAreaInsetsDidChange方法时或之后才能获取到正确的值。我是放在Runloop的第二次循环中去获取的该值。
    注意点3:判断设备是否是iOS11以上 if(@available(iOS 11.0, *))

    状态栏的隐藏有3种情况:iOS9之前、没有UINavigationController、有UINavigationController

    • iOS9之前:基本都采用的[[UIApplication sharedApplication] setStatusBarHidden:NO];之类的几个方法来控制。
    //iOS9之后弃用了
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
    
    //iOS7之后弃用了
    [UIApplication sharedApplication].isStatusBarHidden = YES;
    
    • 没有UINavigationController
      1.可以在工程打包时设置Hide status bar来统一控制整个项目是否显示状态栏。

      Hide status bar

      2.info.plist里设置Status bar is initially hidden来控制整个项目是否显示状态栏


      info.plist设置

      3.在info.plist里设置UIViewControllerBasedStatusBarAppearance的key为YES(默认不设置该key的情况下,是YES),并在每个控制器中单独重写prefersStatusBarHidden方法,来控制单个控制器是否显示状态栏。

    • 有UINavigationController
      1.在有UINavigationController的情况下,在info.plist里设置UIViewControllerBasedStatusBarAppearance的key为YES(默认不设置该key的情况下,是YES),在根控制器UINavigationController中重写prefersStatusBarHidden方法,来控制整个UINavigationController的子控制器是否显示状态栏。

      2.也可以在UINavigationController中重写childViewControllerForStatusBarHidden方法,告诉系统不要调用UINavigationController的prefersStatusBarHidden方法,而是去调用navigationController.topViewController的prefersStatusBarHidden方法。来达到单独的控制每个控制器是否显示状态栏。

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

    修改状态栏颜色有2中情况:有UINavigationController、没有UINavigationController、iOS9之前
    UIStatusBarStyle 枚举说明
    UIStatusBarStyleDefault = 0, // Dark content, for use on light backgrounds(暗背景,用于浅背景)

    UIStatusBarStyleLightContent   = 1, // Light content, for use on dark backgrounds(亮背景,用于深背景)
    //后面2种其实就是上面2种
    UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1,
    UIStatusBarStyleBlackOpaque      NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2,
    
    • 有UINavigationController
      1.使用该方法修改状态栏颜色。需要判断当前状态栏的高度
    //设置状态栏颜色
        UIView *statusView = [[UIView alloc] init];
        statusView.frame = CGRectMake(0, - self.view.safeAreaInset.top, [UIScreen mainScreen].bounds.size.width, self.view.safeAreaInset.top);
        statusView.backgroundColor = [UIColor blackColor];
        [self.navigationController.navigationBar addSubview:statusView];
    

    2.在info.plist里设置UIViewControllerBasedStatusBarAppearance的key为YES(默认不设置该key的情况下,是YES),在根控制器UINavigationController中重写preferredStatusBarStyle方法,来控制整个UINavigationController所有子控制器状态栏颜色。

    3.也可以在UINavigationController中重写childViewControllerForStatusBarStyle方法,告诉系统不要调用UINavigationController的preferredStatusBarStyle方法,而是去调用navigationController.topViewController的preferredStatusBarStyle方法。来达到单独的控制每个控制器是否显示状态栏。

    -(UIViewController *)childViewControllerForStatusBarStyle
    {
      //visibleViewController 当前显示的控制器
      //topViewController 是某个导航栈的栈顶视图
        return self.visibleViewController;
    }
    

    4.设置图片

    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"image01"] forBarMetrics:UIBarMetricsDefault];
    
    • 没有UINavigationController
      1.在info.plist里设置UIViewControllerBasedStatusBarAppearance的key为YES(默认不设置该key的情况下,是YES),并在每个控制器中单独重写preferredStatusBarStyle方法,来控制单个控制器是否显示状态栏。

    2.直接在self.view里添加view控制。

    相关文章

      网友评论

        本文标题:iOS-状态栏的控制(iPhoneX)

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