没有很好的封装,也没有用到很高级的主题库,由于项目比较赶,匆匆的找到了解决办法,写的不是很好,现在记录一下,以后有时间再优化:
#pragma mark - 是否黑色主题
-(void)isBlackTheme
{
//读取开关状态
NSUserDefaults *isBlackorNot = [NSUserDefaults standardUserDefaults];
_isBlack = [isBlackorNot objectForKey:@"isblack"];
if ([_isBlack isEqualToString:@"YES"]) {
//设置整个View的背景色
self.view.backgroundColor = [UIColor BlackThemeBgColor];
//用一个实例化好的image填充navigationbar
UIImage *image = [[UIImage alloc]init];
[self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
//设置透明度,这就是为什么需要设置背景色的原因
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
//设置标题的颜色
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor BlackThemeTextColor]};
//设置tabBar的颜色
[self.tabBarController.tabBar setBarTintColor:[UIColor BlackThemeBgColor]];
//设置状态栏的类型,这个需要在plist里面设置bool,但是iOS9 后不建议用
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
}
}
上述方法可以准确的设置navigation bar的颜色还是有tabBar的颜色,以下两种方法不能达到理想的的需求,感觉很捞
self.navigationController.navigationBar.barTintColor = [UIColor BlackThemeBgColor];
self.tabBarController.tabBar.barTintColor = [UIColor BlackThemeBgColor];
设置状态栏的时候,最好在plist文件中加一个这样的选项:View controller-based status bar appearance
最后要在离开页面的时候做一些处理
-(void)viewWillAppear:(BOOL)animated
{
[self isBlackTheme];
}
-(void)viewDidDisappear:(BOOL)animated
{
[self.tabBarController.tabBar setBarTintColor:[UIColor whiteColor]];
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleDefault];
}
基本过程就是这样,可能有些细节没写上,有疑问可以私信我~
今天又完善了一些,上面提到的状态栏显示只是适合iOS9之前的版本,但是仍然可以使用,只不过有一个警告而已,可是,我的强迫症不允许我的代码里有这种低级的警告的,所以现在补充一下,iOS9 以后如何修改状态栏的颜色:
首先说一下网上大多数博客给的方法:
1.使用iOS新给的建议的方法:
-(UIStatusBarStyle)preferredStatusBarStyle
{
if ([_isBlack isEqualToString:@"YES"]) {
return UIStatusBarStyleLightContent;
}else
{
return UIStatusBarStyleDefault;
}
}
2.在需要的地方调用一下 【self setNeedsStatusBarAppearanceUpdate】
-(void)viewWillAppear:(BOOL)animated
{
[self isBlackTheme];
[self setNeedsStatusBarAppearanceUpdate];
}
基本大多数博客就只有上面的这两点,我在此郑重的说一声:我去你大爷的买买皮!!,天下文章一大抄,一个百度搜索下来,第一个页面全是一模一样的方法,你写这样的博客有什么意思啊,看得人捉急,窝火,还没一点用,光恶心人了。
3.言归正传,其实还有两个步骤的,你需要为NavigationController写一个Category,具体实现如下:
//重写childViewController方法
#import "UINavigationController+StatueBar.h"
@implementation UINavigationController (StatueBar)
- (UIViewController *)childViewControllerForStatusBarStyle{
return self.visibleViewController;
}
- (UIViewController *)childViewControllerForStatusBarHidden{
return self.visibleViewController;
}
4.最后一部,要将前面设置过得plist文件中的View controller-based status bar appearance 的选项设置为YES
以上步骤,亲测有用~