You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS13+下如何通过statusBarManager动态修改状态栏外观?

iOS13+ 动态修改状态栏外观的有效方案

问题背景

Stack Overflow上有一篇《Swift: Setting StatusBar color on IOS13+ (Using statusBarManager)》的问答,仅覆盖了全局或单个UIViewController的初始状态栏深浅设置,未提及动态修改方法。现有代码存在iOS13+废弃API,且重写preferredStatusBarStyle仅在视图加载时生效,无法动态更新。

单个UIViewController动态修改方案

  1. 确认Info.plist配置:确保UIViewControllerBasedStatusBarAppearance设为YES(默认值,若曾修改需恢复)。
  2. 实现动态更新逻辑:
class DemoViewController: UIViewController {
    // 控制状态栏样式的状态变量
    var isDarkMode = false {
        didSet {
            // 状态变更时通知系统更新状态栏
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    // 重写状态栏样式偏好,根据状态变量返回对应样式
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return isDarkMode ? .lightContent : .darkContent
    }

    // 示例:触发样式切换的方法
    func toggleStatusBarStyle() {
        isDarkMode.toggle()
    }
}

当调用toggleStatusBarStyle()或直接修改isDarkMode时,状态栏会自动切换样式。

全局应用统一动态修改方案

方案1:基于基类ViewController(支持VC单独定制)

适合需要全局主题切换,同时部分VC可自定义样式的场景:

  1. 全局主题管理:
class ThemeManager {
    static let shared = ThemeManager()
    var isDarkMode = false {
        didSet {
            // 发送主题变更通知
            NotificationCenter.default.post(name: NSNotification.Name("ThemeUpdated"), object: nil)
        }
    }
}
  1. 基类ViewController实现:
class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 监听主题变更通知
        NotificationCenter.default.addObserver(self, selector: #selector(refreshStatusBar), name: NSNotification.Name("ThemeUpdated"), object: nil)
    }

    @objc private func refreshStatusBar() {
        setNeedsStatusBarAppearanceUpdate()
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return ThemeManager.shared.isDarkMode ? .lightContent : .darkContent
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}
  1. 所有业务ViewController继承自BaseViewController,调用ThemeManager.shared.isDarkMode.toggle()即可全局更新状态栏样式。

方案2:使用StatusBarManager(全局统一控制,无VC定制权限)

适合无需单个VC自定义状态栏的场景:

  1. 修改Info.plist配置:将UIViewControllerBasedStatusBarAppearance设为NO。
  2. 全局设置代码:
func updateGlobalStatusBar(isDarkMode: Bool) {
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return }
    windowScene.statusBarManager?.statusBarStyle = isDarkMode ? .lightContent : .darkContent
}

常见问题说明

  • 之前重写preferredStatusBarStyle未生效,是因为未在状态变量变化时调用setNeedsStatusBarAppearanceUpdate(),系统不会主动重新查询该属性。
  • UIApplication.shared.statusBarStyle是iOS13+废弃API,必须使用上述合规方案替代。

内容的提问来源于stack exchange,提问作者Lorenz Meyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:43:18