[Swift 3.0] 实时动态修改StatusBar状态

首先,如果想使用代码来控制状态栏的显示与隐藏,以及改变样式,需要在Info.plist文件中添加下面这个字段:

View controller-based status bar appearance

类型为Boolean,值为 YES,否则状态栏将不受代码的控制。

对于状态栏的修改, 在iOS 9之后主要是控制器内重写下面三个属性:

// 修改状态栏的样式
// 两种: .lightContent(白色), .default(黑色)
override var preferredStatusBarStyle: UIStatusBarStyle
// 状态栏的隐藏与显示
override var prefersStatusBarHidden: Bool
// 状态栏的隐藏与显示动画方式
// 三种: .none, .fade, .slide
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation

例如:

override var preferredStatusBarStyle: UIStatusBarStyle {
        
        return .lightContent
    }

override var prefersStatusBarHidden: Bool {
        
        return false
    }
    
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
        
        return .slide
    }

但是, 如果想在一个控制器内动态修改状态栏的状态, 例如: 在弹出某视图的时候隐藏状态栏, 视图消失后再显示出来; 或者在弹出某视图的时候样式为白色, 消失后恢复成黑色等. 这就需要我们在代码中动态修改上面重写的返回值.
最容易想到的做法是定义一个全局的属性, 来动态修改, 例如, 我们来动态的让状态栏消失/显示, 我设置了一个这样的属性, 默认是显示状态栏的 :

var isStatusBarHidden = false

然后重写属性:

override var prefersStatusBarHidden: Bool {
        
        return self.isStatusBarHidden
    }

接下来, 我们只需要在需要隐藏/显示状态栏的地方修改这个值即可;

self.isStatusBarHidden = true

但是, 好像没反应…
虽然, 我们修改了返回值的状态, 但是控制器并没有更新这个状态, 这需要我们告诉控制器, 需要刷新状态了, 这就用到了下面这个方法:

open func setNeedsStatusBarAppearanceUpdate()

只需要在修改属性的时候调用一下这个方法即可:

self.isStatusBarHidden = true
self.setNeedsStatusBarAppearanceUpdate()

这样就可以按照我们的需求来动态的修改其状态了.

But, 每次修改状态值, 必须要调一下那个方法, 每次都写好像有些繁琐, 对此,我们可以这样来定义这个属性值:

var isStatusBarHidden = false {
        
        didSet{
			             self.setNeedsStatusBarAppearanceUpdate()
        }
    }

每次状态修改的时候, 就去调用一下这个方法, 这样我们在写代码的时候, 只需要关心状态值即可!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值