技 術(shù) 文 章 / 超 人
以下內(nèi)容在iPhone X和其他設(shè)備都試過走搁。
關(guān)于狀態(tài)欄有3種不同情況:
iPhone X :狀態(tài)欄高度為44
iOS 11以上 :狀態(tài)欄高度為20媳叨,增加了SafeArea安全區(qū)域來判斷狀態(tài)欄高度
iOS 11以下 :狀態(tài)欄高度為20燎孟,一般判斷時直接判斷狀態(tài)欄高度為20
注意點1:iOS11以上,當(dāng)navigationController沒有導(dǎo)航欄時,SafeArea的top就是狀態(tài)欄的高度
注意點2:在iOS11以上獲取SafeArea的值籽懦,一般在viewSafeAreaInsetsDidChange方法時或之后才能獲取到正確的值。我是放在Runloop的第二次循環(huán)中去獲取的該值。
注意點3:判斷設(shè)備是否是iOS11以上 if(@available(iOS 11.0, *))
狀態(tài)欄的隱藏有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.可以在工程打包時設(shè)置Hide status bar來統(tǒng)一控制整個項目是否顯示狀態(tài)欄擅笔。
Hide status bar2.info.plist里設(shè)置Status bar is initially hidden來控制整個項目是否顯示狀態(tài)欄
info.plist設(shè)置3.在info.plist里設(shè)置UIViewControllerBasedStatusBarAppearance的key為YES(默認不設(shè)置該key的情況下,是YES),并在每個控制器中單獨重寫prefersStatusBarHidden方法踏施,來控制單個控制器是否顯示狀態(tài)欄。
-
有UINavigationController
1.在有UINavigationController的情況下罕邀,在info.plist里設(shè)置UIViewControllerBasedStatusBarAppearance的key為YES(默認不設(shè)置該key的情況下畅形,是YES),在根控制器UINavigationController中重寫prefersStatusBarHidden方法诉探,來控制整個UINavigationController的子控制器是否顯示狀態(tài)欄日熬。2.也可以在UINavigationController中重寫childViewControllerForStatusBarHidden方法,告訴系統(tǒng)不要調(diào)用UINavigationController的prefersStatusBarHidden方法肾胯,而是去調(diào)用navigationController.topViewController的prefersStatusBarHidden方法竖席。來達到單獨的控制每個控制器是否顯示狀態(tài)欄耘纱。
-(UIViewController *)childViewControllerForStatusBarHidden
{
return self.topViewController;
}
修改狀態(tài)欄顏色有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.使用該方法修改狀態(tài)欄顏色憎亚。需要判斷當(dāng)前狀態(tài)欄的高度
//設(shè)置狀態(tài)欄顏色
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里設(shè)置UIViewControllerBasedStatusBarAppearance的key為YES(默認不設(shè)置該key的情況下员寇,是YES),在根控制器UINavigationController中重寫preferredStatusBarStyle方法第美,來控制整個UINavigationController所有子控制器狀態(tài)欄顏色蝶锋。
3.也可以在UINavigationController中重寫childViewControllerForStatusBarStyle方法,告訴系統(tǒng)不要調(diào)用UINavigationController的preferredStatusBarStyle方法什往,而是去調(diào)用navigationController.topViewController的preferredStatusBarStyle方法扳缕。來達到單獨的控制每個控制器是否顯示狀態(tài)欄。
-(UIViewController *)childViewControllerForStatusBarStyle
{
//visibleViewController 當(dāng)前顯示的控制器
//topViewController 是某個導(dǎo)航棧的棧頂視圖
return self.visibleViewController;
}
4.設(shè)置圖片
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"image01"] forBarMetrics:UIBarMetricsDefault];
-
沒有UINavigationController
1.在info.plist里設(shè)置UIViewControllerBasedStatusBarAppearance的key為YES(默認不設(shè)置該key的情況下别威,是YES)躯舔,并在每個控制器中單獨重寫preferredStatusBarStyle方法,來控制單個控制器是否顯示狀態(tài)欄省古。
2.直接在self.view里添加view控制庸毫。