[iOS]部分页面变换主题,navigation bar,tabBar颜色修改,状态栏

没有很好的封装,也没有用到很高级的主题库,由于项目比较赶,匆匆的找到了解决办法,写的不是很好,现在记录一下,以后有时间再优化:

#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

以上步骤,亲测有用~ 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值