如何以编程方式在 iOS 13 中隐藏和显示状态栏?

Posted

技术标签:

【中文标题】如何以编程方式在 iOS 13 中隐藏和显示状态栏?【英文标题】:How to programmatically hide and show status bar in iOS 13? 【发布时间】:2020-01-27 18:46:57 【问题描述】:

我已经做了以下隐藏和再次显示状态栏的常用方法。它在 ios 13 之前运行良好,但是当我为具有 iOS 13 或更高版本的设备运行它时,我遇到了崩溃。

+(void)showStatusBar:(BOOL)show

    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];

    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) 
        [[UIApplication sharedApplication] setStatusBarHidden:!show withAnimation:UIStatusBarAnimationNone];
    

iOS 13 出现以下错误

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'应用程序调用 -statusBar 或 UIApplication 上的 -statusBarWindow:此代码必须更改,因为不再有状态栏或状态栏窗口。使用 窗口场景中的 statusBarManager 对象。'

我可以做些什么来隐藏和显示某些视图控制器的状态栏?

【问题讨论】:

developer.apple.com/documentation/uikit/uiviewcontroller/… 【参考方案1】:

如果您想在不同的视图控制器上显示/隐藏状态栏,您需要:

    在 Info.plist 中添加 View controller-base status bar appearance 选项并将其设置为 YES 在您希望显示/隐藏状态栏的每个视图控制器中覆盖 var prefersStatusBarHidden: Bool
override var prefersStatusBarHidden: Bool  
  return true 
 

如果你想动态显示/隐藏它(例如点击按钮后),你可以这样做:

var statusBarHidden = true 
  didSet 
    setNeedsStatusBarAppearanceUpdate()
  


override var prefersStatusBarHidden: Bool  
  return statusBarHidden 

你可以在这里找到更详细的解释Here

同样在Apple Documentation for UIStatusBarManager 中,您可以找到以下引用:

您不使用此对象来修改状态栏的配置。相反,您为每个 UIViewController 对象单独设置状态栏配置。例如,要修改状态栏的默认可见性,请覆盖视图控制器的 prefersStatusBarHidden 属性。

【讨论】:

@coolcool1994 这很奇怪。您能否再次检查您是否已完成步骤 1:在 Info.plist 中添加“查看基于控制器的状态栏外观”选项并将其设置为 YES。没有它就没有区别

以上是关于如何以编程方式在 iOS 13 中隐藏和显示状态栏?的主要内容,如果未能解决你的问题,请参考以下文章

添加新 UIWindow 时以编程方式隐藏状态栏?

如何以编程方式获取 iOS 状态栏高度

如何强制显示移动 Safari 底部导航栏以编程方式显示?

如何通过单击事件以编程方式显示/隐藏操作栏项目

如何以编程方式在 Windows 8 和 Windows 10 桌面登录屏幕上显示状态栏? [关闭]

状态栏不会消失