Swift——preferredStatusBarStyle状态栏颜色

本文解决在Swift4.2和Xcode10.0环境下,使用自定义UINavigationController时,状态栏颜色设置不响应的问题。通过重写childForStatusBarStyle方法及调整info.plist设置,实现状态栏样式自定义。

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

最近在设置某些页面状态栏颜色的时候出现了属性不响应的问题

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
复制代码

依稀记得是直接重写preferredStatusBarStyle: UIStatusBarStyle这个属性,然后将info.plist中的View controller-based status bar appearance设置为NO

但是这样设置之后发现还是不响应。

环境相关:swift 4.2 , Xcode 10.0

然后我就开始各种搜索和尝试,发现如果是自定义的UINavigationController,现在需要重写另外一个属性

/// 重写此方法让 preferredStatusBarStyle 响应
    override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
复制代码

为什么要重写这个东西呢? 因为这两个方法默认返回值是nil 也就是当我们调用setNeedsStatusBarAppearanceUpdate的时候,系统会调用Container(容器控制器)的preferredStatusBarStyle这个方法(window?.rootViewController的preferred的方法,一般我们用UINavigationController或者UITabBarController来做Container),也就是根本不会调用子控制器(我们所看到的UIViewcontroller)的preferredStatusBarStyle方法。 这个时候childForStatusBarHidden和childForStatusBarStyle两个方法就派上用场了。

并且将info.plist中的View controller-based status bar appearance设置为YES

然后设置状态栏的属性就可以响应了!

基本看到的文章都是把另外一个属性也重写,关于隐藏的

   override var childForStatusBarHidden: UIViewController? {
       return self.topViewController
   }
复制代码

但是我测试了一下返现不用写,隐藏属性可以直接生效

    override var prefersStatusBarHidden: Bool {
        return true
    }
复制代码

看到说如果是有自定义UITabBarController的,需要重写这个属性。但是我没有尝试,放出来给个提醒好了

override var childViewControllerForStatusBarStyle: UIViewController? {
    return self.selectedViewController
}
复制代码

最后我尝试将info.plist中的View controller-based status bar appearance直接删掉,发现也是可以的,可能这个属性默认为YES。

总结,敲黑板啦。如果想设置某个页面状态栏为白色

1.重写状态栏样式

    override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
复制代码

2.在自定义的UINavigationController中重写此方法

    /// 重写此方法让 preferredStatusBarStyle 响应
    override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值