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)

    技 术 文 章 / 超 人 以下内容在iPhone X和其他设备都试过。 关于状态栏有3种不同情况:iPhone ...

  • iPhoneX适配(UI)

    1.相关宏 2.动态宽高的适配 iPhoneX之前:状态栏:20 导航栏:20+44iPhoneX之后:状态栏:4...

  • iOS 开发小日记 - 持续更新

    /** 设备屏幕宽度 */ /** 设备屏幕高度 */ /** iPhoneX判断 */ /** 状态栏高度 */...

  • iphone/iphoneX 状态栏高度/底部安全区域高度

    状态栏高度 iphone 20 iphoneX 44 iphoneX 安全区域高度 34 大前端知识库收集分享 w...

  • iOS iPhoneX 适配

    一 iPhoneX各个视图值 1.简单定义一下IPoneX 2.了解IPhoneX各个视图的高度 状态栏 - st...

  • iPhoneX适配小记

    竖屏 我们都知道在iPhoneX之前机型: 状态栏(statusBar) + 导航栏(navigationBar)...

  • iphoneX适配

    废话不多说,直接进入正题,iphoneX适配。 首先说一下iphoneX相较于之前的变化 1.最主要的一点,状态栏...

  • ReactNative SafeAreaView修改IOS上下安

    Reactnative 使用SafeAreaView适配IOS iphonex 刘海屏 状态栏和底部背景色 最新新...

  • 2018-04-09

    原文:IOS状态栏和导航栏的控制问题 IOS的项目多数会遇到控制状态栏和导航栏的问题,比如隐藏状态栏、控制状态栏的...

  • Android 显示、隐藏状态栏和导航栏

    Android 显示、隐藏状态栏和导航栏 控制状态栏显示,Activity的主题中配置全屏属性 控制状态栏显示,在...

网友评论

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

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