iOS13+下如何通过statusBarManager动态修改状态栏外观?
iOS13+ 动态修改状态栏外观的有效方案
问题背景
Stack Overflow上有一篇《Swift: Setting StatusBar color on IOS13+ (Using statusBarManager)》的问答,仅覆盖了全局或单个UIViewController的初始状态栏深浅设置,未提及动态修改方法。现有代码存在iOS13+废弃API,且重写preferredStatusBarStyle仅在视图加载时生效,无法动态更新。
单个UIViewController动态修改方案
- 确认Info.plist配置:确保
UIViewControllerBasedStatusBarAppearance设为YES(默认值,若曾修改需恢复)。 - 实现动态更新逻辑:
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可自定义样式的场景:
- 全局主题管理:
class ThemeManager { static let shared = ThemeManager() var isDarkMode = false { didSet { // 发送主题变更通知 NotificationCenter.default.post(name: NSNotification.Name("ThemeUpdated"), object: nil) } } }
- 基类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) } }
- 所有业务ViewController继承自
BaseViewController,调用ThemeManager.shared.isDarkMode.toggle()即可全局更新状态栏样式。
方案2:使用StatusBarManager(全局统一控制,无VC定制权限)
适合无需单个VC自定义状态栏的场景:
- 修改Info.plist配置:将
UIViewControllerBasedStatusBarAppearance设为NO。 - 全局设置代码:
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
相关产品推荐
相关产品推荐

