iOS基础:修改app状态栏颜色以及原生的导航栏颜色

<1>设置状态栏文字颜色以及背景颜色

这个设置引用自链接:https://www.jianshu.com/p/889cff2b3a52

苹果目前状态栏目前有两种状态颜色

iOS7以后

状态栏的字体为黑色:UIStatusBarStyleDefault

状态栏的字体为白色背景:UIStatusBarStyleLightContent

解决方案

1、在info.plist中,将View controller-based status bar appearance 设为 NO

状态栏字体的颜色只由下面的属性设定,默认为白色:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;

 

解决个别vc中状态栏字体颜色不同的办法(即将显示页面的时候改成要的颜色,即将消失的时候再改回统一的颜色)

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

}

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;

}

2、在info.plist中,将View controller-based status bar appearance 设为 YES

在info.plist中 View controller-based status bar appearance 的 默认值就是YES

如果View controller-based status bar appearance为YES 时 [UIApplication sharedApplication].statusBarStyle 无效。

1、在vc中重写vc的preferredStatusBarStyle方法
    -(UIStatusBarStyle)preferredStatusBarStyle {
        return UIStatusBarStyleDefault;
    }
2、在viewDidload中调用:
    [self setNeedsStatusBarAppearanceUpdate];

可能出现的问题:

当vc在nav中时,上面方法没用,vc中的preferredStatusBarStyle方法根本不用被调用。

原因是,[self setNeedsStatusBarAppearanceUpdate]发出后,只会调用navigation controller中的preferredStatusBarStyle方法,vc中的preferredStatusBarStyley方法跟本不会被调用。

解决办法有两个:

方法一:

    设置 navbar 的barStyle 属性会影响status bar 的字体和背景色。如下。

    //status bar的字体为白色 ,导航栏的背景色是黑色。

    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

    //status bar的字体为黑色 ,导航栏的背景色是白色,状态栏的背景色也是白色。

    self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
    
方法二:

    自定义一个navController的子类,在这个子类中重写preferredStatusBarStyle方法:

    MyNav* nav = [[MyNav alloc] initWithRootViewController:vc];

    self.window.rootViewController = nav;

    @implementation MyNav

    - (UIStatusBarStyle)preferredStatusBarStyle {
        UIViewController* topVC = self.topViewController;
        return [topVC preferredStatusBarStyle];
    }

隐藏某个控制器的状态栏
1.View controller-based status bar appearance  = NO
[[UIApplication sharedApplication] setStatusBarHidden:hidden];

2.View controller-based status bar appearance  = YES
-  (BOOL)prefersStatusBarHidden {
    return YES;
}

3.设置Status bar is initially hidden = YES
可以隐藏启动页展示过程的状态栏。

<2>设置导航栏颜色--就是原生navigationBar背景颜色,字体颜色

其实用原生的话,如果设计没毛病,不改来改去还好,一套统一的bar颜色安安全全下来。完美。

但是如果设计这个页面要白色,那个页面要黄色,另一个页面要花色,就比较坑了,也不是原生不能改,只是写起来代码会多点,建议有个做个navigationController基类,封装个方法来处理。

再有空点,就自己写个假的bar,搞掉系统的,用自己假bar来处理,就不用这个多代码了,但是自己写的话,需要自己处理很多东西,比如按钮的大小适配了,文字的大小适配了,上面的view的宽高了。

用原生的bar修改颜色的话,代码上吧:

       [self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor colorFromHex:kNavBarNewColor] andSize:CGSizeMake(1, 64)] forBarMetrics:UIBarMetricsDefault];
    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = [UIColor colorFromHex:kNavBarNewColor];
    }
    [self.navigationController.navigationBar setShadowImage:[UIImage imageWithColor:[UIColor colorFromHex:kNavBarNewColor]]];
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:[UIColor whiteColor]};
  
 

 

 

 

 

 

你可能感兴趣的:(iOS基础)