技 術 文 章 / 超 人
以下內容在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來統一控制整個項目是否顯示狀態欄。
Hide status bar2.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控制。