iOS7之后關於UINavigationBar和Status Bar都發生了一系列的改變,如果不需要兼容iOS7之后的設備,按照網上有些資料去解決問題會踩到一些坑。在iOS 7中,我們可以修改每個View Controller中狀態欄的外觀,而iOS7之前的狀態欄都是白色風格。iOS7之前設置背景顏色還需要搞個背景View覆蓋,而iOS7只需要設置一下barTintColor顏色即可。
UINavigationBar設置
1.設置背景顏色:
[self.navigationController.navigationBar setBarTintColor:[UIColor redColor]];
效果如下:
2.Translucent設置成透明度,設置成YES會有一種模糊效果:
[self.navigationController.navigationBar setTranslucent:YES];
設置為NO的效果:
3.設置背景圖片,圖片樣式需要根據情況適用,調用方法為setBackGroundImage:
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"FlyElephant.png"] forBarMetrics:UIBarMetricsDefault];
4.設置NavigationBar標題大小及顏色,之前設置是通過UITextAttributeFont,UITextAttributeTextColor,UITextAttributeTextShadowColor和UITextAttributeTextShadowOffset設置,現在需要都根據NS開頭的屬性去設置:
NSDictionary *textAttributes=@{NSForegroundColorAttributeName:[UIColor whiteColor],NSFontAttributeName:[UIFont systemFontOfSize:20]}; [self.navigationController.navigationBar setTitleTextAttributes:textAttributes];
5.NavigationBar設置中間的標題或者自定義View:
[self.navigationItem setTitle:@"旅行"]; [self.navigationItem setTitleView:[UIImage imageNamed:@"FlyElephant"];
6.單個或多個左右Item設置:
單個leftItem設置:
UIBarButtonItem *leftBarButton=[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"BackIcon"] style:UIBarButtonItemStylePlain target:self action:@selector(popBack)]; [leftBarButton setTintColor:[UIColor colorWithWhite:0 alpha:1]]; self.navigationItem.leftBarButtonItem=leftBarButton;
效果如下:
多個rightItem設置:
UIBarButtonItem *firstItem=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:nil]; UIBarButtonItem *secondItem=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:nil]; NSArray *rightItems=@[firstItem, secondItem]; self.navigationItem.rightBarButtonItems=rightItems;
效果如下:
狀態欄(StatusBar)設置
iOS7之前狀態欄永遠是白色風格,我們沒有太多的空間去進行修改,iOS 7之后,我們可以修改每個控制器中狀態欄的外觀,比如說在白天和夜間模式的切換過程中我們可以修改狀態欄的顏色。狀態欄上的時間、電池指示器和Wi-Fi信號默認是暗色,如上圖所示,不過我們可以通過修改UIBarStyle然后執preferredStatusBarStyle的覆寫方法:
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
最終執行的是覆寫控制器中preferredStatusBarStyle的方法:(如果上面的代碼不寫是不會執行到preferredStatusBarStyle方法的)
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
效果如下:
隱藏狀態欄只需要覆寫一下prefersStatusBarHidden即可:
- (BOOL)prefersStatusBarHidden { return YES; }
效果如下:
如果需要重新刷新一下狀態欄,可以通過setNeedsStatusBarAppearanceUpdate控制~