iOS-状态栏的控制(iPhoneX)

技 术 文 章 / 超 人


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

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

iOS-状态栏的控制(iPhoneX)_第1张图片
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来统一控制整个项目是否显示状态栏。

    iOS-状态栏的控制(iPhoneX)_第2张图片
    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))