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

本文介绍了如何在iOS应用中修改状态栏的文字颜色和背景颜色,以及导航栏的背景和字体颜色。针对iOS7以后的情况,提供了两种不同设置状态栏风格的方法,并解释了在View controller-based status bar appearance为YES和NO时的处理策略。同时,文章讨论了如何根据需求动态改变导航栏颜色,包括设置背景图片、阴影图片以及调整标题颜色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<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]};
  
 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值