iOS的項目多數(shù)會遇到控制狀態(tài)欄和導航欄的問題,比如隱藏狀態(tài)欄、控制狀態(tài)欄的文字顏色等,導航欄也有同樣需求。
自從iOS7之后狀態(tài)欄就是透明的了 高度 20.f 導航欄的高度是 64.f
狀態(tài)欄的控制
狀態(tài)欄的設置分為兩種: 1.全局設置 2.分頁面設置
控制這兩種模式的開關是info.plist文件的配置項。
1).Property List 下是 View controller-based status bar appearance
2).Source Code 下是 UIViewControllerBasedStatusBarAppearance
全局設置
在info.plist 文件中設置 View controller-based status bar appearance 為NO 設置為全局設置,即vc中的方法是無法控制的,真正的控制方法如下:
//設置狀態(tài)欄字體顏色
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
//設置狀態(tài)欄是否隱藏
[[UIApplication sharedApplication] setStatusBarHidden:YES];
/*
狀態(tài)欄字體顏色上呢 只是說改變對應枚舉值進行顏色設置 不能做任意修改
UIStatusBarStyleDefault 黑色
UIStatusBarStyleLightContent 白色
狀態(tài)欄是否顯示,一般而言app不會對所有界面都不顯示狀態(tài)欄,而是只在特定的頁面需要隱藏狀態(tài)欄,比如對于視頻播放界面不希望顯示狀態(tài)欄。
對于狀態(tài)欄的背景色設置,從ios7開始狀態(tài)欄本身實際上是透明的,它的背景色其實取決于導航欄。
*/
分頁面設置
在info.plist 文件中設置 View controller-based status bar appearance 為YES 設置為分頁面VC設置控制,分兩種情況:
1.VC不在UINavigationController 或者說VC是根控制器
狀態(tài)欄字體顏色設置
//直接設置導航欄字體顏色
- (UIStatusBarStyle)preferredStatusBarStyle
{
//返回白色
return UIStatusBarStyleLightContent;
//返回黑色
//return UIStatusBarStyleDefault;
}
在view的某個加載階段比如viewWillAppear中,執(zhí)行如下代碼,這樣更保險:
//刷新狀態(tài)欄
[self setNeedsStatusBarAppearanceUpdate];
隱藏控制
//直接設置
- (BOOL)prefersStatusBarHidden {
return YES;
}
在view的某個加載階段比如viewWillAppear中,執(zhí)行如下代碼,這樣更保險:
[self setNeedsStatusBarAppearanceUpdate];
2.當VC在UINavigationController中時(或者是VC不是根控制器),VC并不能通過上面的方式控制狀態(tài)欄的顏色,需要通過如下方法間接控制:
狀態(tài)欄字體顏色設置
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
隱藏控制
這個就比控制狀態(tài)欄字體顏色要復雜一些了,這個需要通過子VC控制根VC,從而達到控制根控制器的目的,方法如下:
假設根VC為TabVC,那么TabVC中要設置如下代碼
//TabVC
//定義一個變量來控制狀態(tài)欄顯示,子VC通過修改這個值來間接控制
@property (nonatomic ,assign) BOOL statusBarHidden;
- (BOOL)prefersStatusBarHidden {
return _statusBarHidden;
}
//子VC
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
[self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)];
[self setNeedsStatusBarAppearanceUpdate];
}
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
//注意對NO的情況,不能傳@NO,只能傳nil才能被當成NO
[self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:nil];
[self setNeedsStatusBarAppearanceUpdate];
}
}
//可以看到在子VC中通過設置根VC的屬性,并調(diào)用setNeedsStatusBarAppearanceUpdate后,根VC的prefersStatusBarHidden就會被調(diào)用,從而隱藏或顯示狀態(tài)欄。
導航欄
//iOS7 之后默認半透明
@property(nonatomic,assign,getter=isTranslucent) BOOL translucent //設置是否半透明
//這是導航欄背景色 這個設置方法可以在AppDelegate中設置,父類中設置,全局可以生效。
[[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]];
//導航欄背景色 控制器中也可以這么用
[self.navigationController.navigationBar setBarTintColor:[UIColor yellowColor]];
//導航欄設置背景圖片 注意圖片高度 44.f 將不會設置狀態(tài)欄背景 64.f 可置頂部位置 全部設置
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@ "nav_bg.png" ] forBarMetrics:UIBarMetricsDefault];
//導航欄標題設置
//可以全局設置 在AppDelegate中 父類中
NSShadow *shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8];
shadow.shadowOffset = CGSizeMake(0, 1);
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName,
shadow, NSShadowAttributeName,
[UIFont fontWithName:@ "HelveticaNeue-CondensedBlack" size:21.0], NSFontAttributeName, nil]];
//控制器中這么設置也可以
[self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:16.f],NSForegroundColorAttributeName:[UIColor WhiteColor]}];
//設置返回按鈕(等系統(tǒng)按鈕)可以通過TintColor,直接來設置顏色
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];