iOS 13中statusBarHidden已废弃,如何获取statusBarManager句柄?
iOS 13+ 获取 StatusBarManager 方法指南
嘿,这个问题我太熟悉了!iOS 13 之后苹果把状态栏的管理逻辑从全局的 UIApplication 迁移到了**窗口场景(UIWindowScene)**层级,所以原来的 UIApplication.sharedApplication.statusBarHidden=YES; 才会被废弃。下面分不同场景给你讲怎么拿到 statusBarManager 的句柄:
1. 在 UIViewController 中获取
这是最常见的场景,直接通过控制器的 view 关联的 window 就能拿到对应的 windowScene,进而获取 statusBarManager:
// Objective-C 写法 UIStatusBarManager *statusBarManager = self.view.window.windowScene.statusBarManager; if (statusBarManager) { statusBarManager.statusBarHidden = YES; }
// Swift 写法 if let statusBarManager = self.view.window?.windowScene?.statusBarManager { statusBarManager.isStatusBarHidden = true }
2. 在 AppDelegate 或全局代码中获取
如果需要在全局层面操作,得先筛选出当前处于活跃状态的窗口场景(因为 iOS 13+ 支持多窗口):
// Objective-C 写法 UIStatusBarManager *statusBarManager = nil; for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:UIWindowScene.class]) { statusBarManager = ((UIWindowScene *)scene).statusBarManager; break; } } if (statusBarManager) { statusBarManager.statusBarHidden = YES; }
// Swift 写法 guard let activeScene = UIApplication.shared.connectedScenes .filter({ $0.activationState == .foregroundActive }) .first as? UIWindowScene else { return } let statusBarManager = activeScene.statusBarManager statusBarManager?.isStatusBarHidden = true
3. 在 SceneDelegate 中获取
如果你的项目是 iOS 13+ 默认的 SceneDelegate 架构,那直接用当前场景的属性就能拿到,非常方便:
// Objective-C 写法 UIStatusBarManager *statusBarManager = self.windowScene.statusBarManager; if (statusBarManager) { statusBarManager.statusBarHidden = YES; }
// Swift 写法 if let statusBarManager = self.windowScene?.statusBarManager { statusBarManager.isStatusBarHidden = true }
另外补充一句:如果你的项目是基于控制器管理状态栏样式/隐藏状态的,记得确保 Info.plist 里的 UIViewControllerBasedStatusBarAppearance 设置为 YES,或者根据需求调整,避免出现冲突。
内容的提问来源于stack exchange,提问作者TomV
相关产品推荐
相关产品推荐

