技 术 文 章 / 超 人
以下内容在iPhone X和其他设备都试过。
关于状态栏有3种不同情况:
iPhone X :状态栏高度为44
iOS 11以上 :状态栏高度为20,增加了SafeArea安全区域来判断状态栏高度
iOS 11以下 :状态栏高度为20,一般判断时直接判断状态栏高度为20
注意点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来统一控制整个项目是否显示状态栏。
2.info.plist里设置Status bar is initially hidden来控制整个项目是否显示状态栏
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控制。