第一种方法:
1、在info.plist文件中将View controller-based status bar appearance设置为NO
2、设置[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent即状态栏字体颜色为白色;或者[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault即状态栏字体颜色为黑色。
优缺点:这种方法设置的优点是设置一次之后就不需要再设置。不过,这个也是它的缺点,对于要求状态栏字体颜色不同的场景,只能选择第二种方法。
第二种方法:
1、在info.plist文件中将View controller-based status bar appearance设置为YES,或者不设置,因为它默认为YES;注意:如果将它设置为NO时,下面的步骤将不起作用。
2、在UIViewController中覆写- (UIStatusBarStyle)preferredStatusBarStyle方法,返回UIStatusBarStyleLightContent或UIStatusBarStyleDefault即可。
优缺点:优点是灵活,基本上可以满足所有需求,建议使用此方法进行设置。可以定义一个BaseViewController和BaseNavigationController,然后在它们里面覆写- (UIStatusBarStyle)preferredStatusBarStyle方法,返回UIStatusBarStyleDefault或UIStatusBarStyleLightContent作为主体风格,在个别不同需求的控制器覆写此方法即可。
最近在做公司一个产品精细化,如果大家在项目中 "个人中心"(个人资料)中需要上传头像调用了系统的UIImagePickerController控件,大家会发现导航条都是默认的风格没有和整个项目中的风格完全不一致。这时候大家可以参考下如下代码:
-(void)showImagePickerWithSourceType:(UIImagePickerControllerSourceType)sourceType { UIImagePickerController *imgPickerController = [[UIImagePickerController alloc] init]; [[imgPickerController navigationBar] setTintColor:[UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1]]; [[imgPickerController navigationBar] setBackgroundImage:[UIImage themeNavBg] forBarMetrics:UIBarMetricsDefault]; imgPickerController.allowsEditing = YES; imgPickerController.delegate = self; imgPickerController.sourceType = sourceType; [self presentViewController:imgPickerController animated:YES completion:nil]; } - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { for (UINavigationItem *item in navigationController.navigationBar.subviews) { if ([item isKindOfClass:[UIButton class]]&&([item.title isEqualToString:@"取消"]||[item.title isEqualToString:@"Cancel"])) { UIButton *button = (UIButton *)item; [button setTitleEdgeInsets:UIEdgeInsetsMake(0, -20, 0, 0)]; } } [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; } -(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; }
最后,遇到的问题总结总结:
1、若是在控制器覆写了-(UIStatusBarStyle)preferredStatusBarStyle方法,却发现没有作用,查看是否info.plist文件中将View controller-based status bar appearance设置为NO了。
2、当ViewController在UINavigationController中时,如果导航栏存在,则以UINavigationController中-(UIStatusBarStyle)preferredStatusBarStyle返回风格为标准;如果导航栏隐藏了,则以控制器中返回的风格为标准。
3、在iOS8中,UIStatusBarStyleBlackTranslucent与UIStatusBarStyleBlackOpaque相当于UIStatusBarStyleLightContent。