iOS的項目多數會遇到控制狀態欄和導航欄的問題,好比隱藏狀態欄、控制狀態欄的文字顏色等,導航欄也有一樣需求。ios
自從iOS7以後狀態欄就是透明的了 高度 20.f 導航欄的高度是 64.fapp
狀態欄的設置分爲兩種: 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中的方法是沒法控制的,真正的控制方法以下:atom
//設置狀態欄字體顏色 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; //設置狀態欄是否隱藏 [[UIApplication sharedApplication] setStatusBarHidden:YES]; /* 狀態欄字體顏色上呢 只是說改變對應枚舉值進行顏色設置 不能作任意修改 UIStatusBarStyleDefault 黑色 UIStatusBarStyleLightContent 白色 狀態欄是否顯示,通常而言app不會對全部界面都不顯示狀態欄,而是隻在特定的頁面須要隱藏狀態欄,好比對於視頻播放界面不但願顯示狀態欄。 對於狀態欄的背景色設置,從ios7開始狀態欄自己其實是透明的,它的背景色其實取決於導航欄。 */
在info.plist 文件中設置 View controller-based status bar appearance 爲YES 設置爲分頁面VC設置控制,分兩種狀況: 1.VC不在UINavigationController 或者說VC是根控制器code
//直接設置導航欄字體顏色 - (UIStatusBarStyle)preferredStatusBarStyle { //返回白色 return UIStatusBarStyleLightContent; //返回黑色 //return UIStatusBarStyleDefault; }
在view的某個加載階段好比viewWillAppear中,執行以下代碼,這樣更保險:orm
//刷新狀態欄 [self setNeedsStatusBarAppearanceUpdate];
//直接設置 - (BOOL)prefersStatusBarHidden { return YES; }
在view的某個加載階段好比viewWillAppear中,執行以下代碼,這樣更保險:視頻
[self setNeedsStatusBarAppearanceUpdate];
2.當VC在UINavigationController中時(或者是VC不是根控制器),VC並不能經過上面的方式控制狀態欄的顏色,須要經過以下方法間接控制:圖片
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
這個就比控制狀態欄字體顏色要複雜一些了,這個須要經過子VC控制根VC,從而達到控制根控制器的目的,方法以下: 假設根VC爲TabVC,那麼TabVC中要設置以下代碼get
//TabVC //定義一個變量來控制狀態欄顯示,子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的屬性,並調用setNeedsStatusBarAppearanceUpdate後,根VC的prefersStatusBarHidden就會被調用,從而隱藏或顯示狀態欄。
//iOS7 以後默認半透明 @property(nonatomic,assign,getter=isTranslucent) BOOL translucent //設置是否半透明 //這是導航欄背景色 這個設置方法能夠在AppDelegate中設置,父類中設置,全局能夠生效。 [[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]]; //導航欄背景色 控制器中也能夠這麼用 [self.navigationController.navigationBar setBarTintColor:[UIColor yellowColor]]; //導航欄設置背景圖片 注意圖片高度 44.f 將不會設置狀態欄背景 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]}]; //設置返回按鈕(等系統按鈕)能夠經過TintColor,直接來設置顏色 [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];