iOS状态栏

这篇博客详细介绍了如何在iOS中控制状态栏,包括全局设置和分页面设置。全局设置通过修改info.plist文件,可以控制状态栏的显示风格和隐藏。分页面设置则需要视图控制器逐个管理,状态栏字体颜色的调整根据是否在UINavigationController中有不同的方法。同时,博客提到了隐藏状态栏的条件和技巧,特别是在非根控制器中如何影响状态栏的显示。

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

状态栏可以通过UIApplication类提供的一些方法来修改
比如完全去掉状态栏或者修改风格,这些改变只是在程序内部,当退出程序又会复原

参考文章 iOS状态栏操作
参考文章 iOS状态栏和导航栏的控制问题 *
参考文章 定制iOS 7中的导航栏和状态栏 *
参考文章 ios上更改状态栏(UIStatusBar)的颜色
参考文章 在iOS7中修改状态栏字体的颜色

  • 是否显示网络活动(等待)标志
[UIApplication sharedApplication].networkActivityIndicatorVisible
  • 获取状态栏的信息
[UIApplication sharedApplication].statusBarFrame;

控制状态栏

对状态栏的控制分两种情况:全局设置和分页面设置。
控制这两种模式的开关是 info.plist 文件的 View controller-based status bar appearance 配置项。

全局设置状态栏

info.plist 文件的 View controller-based status bar appearance 设置为 NO,即可开启全局设置,
也就是说你在视图控制器中对状态栏的控制都将无效,相比之下,是通过下面的代码来全局控制:(可能已弃用)

// 设置状态栏的字体颜色模式
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
// 设置状态栏是否隐藏
[[UIApplication sharedApplication] setStatusBarHidden:YES];
注意

我们并不能对状态栏的字体颜色做任意的控制,只有两种选择UIStatusBarStyleDefault和UIStatusBarStyleLightContent,前者是默认的黑色,而后者是白色。也就是说如果你的背景色是偏深色,那么设置状态栏的字体颜色为白色。另外,我们可以全局设置状态栏是否显示,但是一般而言app不会对所有界面都不显示状态栏,而是只在特定的页面需要隐藏状态栏,比如对于视频播放界面不希望显示状态栏。

对于状态栏的背景色设置,上面提到从iOS7开始状态栏本身实际上是透明的,它的背景色其实取决于导航栏的背景色。


分页面设置状态栏

info.plist 文件的 View controller-based status bar appearance 设置为 YES ,即可开启由视图控制器来控制状态栏的功能,在这种模式下,全局的设置将无效!!所以我们必须逐个页面对状态栏进行设置,否则状态栏将维持默认的黑色字体和默认为显示状态。

字体设置

对于设置状态栏字体颜色,分两种情况:视图控制器是否属于UINavigationController中:

  1. 当视图控制器不在UINavigationController中时,在VC中添加一个方法

    - (UIStatusBarStyle)preferredStatusBarStyle
    { 
        //返回白色
        return UIStatusBarStyleLightContent;
        //返回黑色
        //return UIStatusBarStyleDefault;
    }

    保险起见,在view的某个加载阶段比如viewWillAppear中,执行:

    [self setNeedsStatusBarAppearanceUpdate];
  2. 当视图控制器在UINavigationController中时,VC并不能通过方式1控制状态栏的颜色,详见本文后面的参考资料,那么这个时候,有一个trick的方法可以在VC中间接的控制:

    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
隐藏控制

对于控制状态栏的隐藏同样存在VC是否是根控制器的问题,也就说只有根控制器才能直接控制状态栏的显示与否。

  1. 如果是VC本身就是根控制器,那么在VC中添加如下代码:

    - (BOOL)prefersStatusBarHidden {
        return YES;
    }

    当然,保险起见,在适当的时候调用

    [self setNeedsStatusBarAppearanceUpdate];
  2. 如果VC不是根控制器,那么不像控制字体颜色那样有trick,我们只能间接的通过在子VC中控制根VC,从而间接控制根控制器。那么这个方法就很多了,比如我的根VC是个tab的VC,首先现在tab的VC中,实现1:

@interface YYCTabBarController : RDVTabBarController

//定义一个变量来控制状态栏显示,子VC通过修改这个值来间接控制
@property (nonatomic,assign)BOOL statusBarHidden;

@end

@implementation YYCTabBarController

- (BOOL)prefersStatusBarHidden {
    return _statusBarHidden;
}

@end

在子VC中:

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    // rdv_tabBarController指向YYCTabBarController
    if([self.rdv_tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
        [self.rdv_tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)];
        [self setNeedsStatusBarAppearanceUpdate];
    }
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];

    if([self.rdv_tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){
        // 注意对NO的情况,不能传@NO,只能传nil才能被当成NO
        [self.rdv_tabBarController performSelector:@selector(setStatusBarHidden:) withObject:nil];
        [self setNeedsStatusBarAppearanceUpdate];
    }
}

可以看到在子VC中通过设置根VC的属性,并调用setNeedsStatusBarAppearanceUpdate后,根VC的prefersStatusBarHidden就会被调用,从而隐藏或显示状态栏。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值