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



我制作了以下常用方法来隐藏和再次显示状态栏。它在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 上的状态栏窗口:必须更改此代码,因为不再有状态栏或状态栏窗口。使用 状态栏管理器对象改为窗口场景。

如何仅隐藏和显示某些视图控制器的状态栏?

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

  1. 在 Info.plist 中添加基于视图控制器的状态栏外观选项,并将其设置为"是">
  2. 覆盖每个视图控制器中要显示/隐藏状态栏的var prefersStatusBarHidden: Bool
override var prefersStatusBarHidden: Bool { 
return true 
} 

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

var statusBarHidden = true {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var prefersStatusBarHidden: Bool { 
return statusBarHidden 
}
  • 你可以在这里找到更详细的解释 这里

  • 同样在 Apple 文档UIStatusBarManager中,您可以找到以下引用:

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

最新更新