我制作了以下常用方法来隐藏和再次显示状态栏。它在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 上的状态栏窗口:必须更改此代码,因为不再有状态栏或状态栏窗口。使用 状态栏管理器对象改为窗口场景。
如何仅隐藏和显示某些视图控制器的状态栏?
如果要显示/隐藏不同视图控制器上的状态栏,则需要:
- 在 Info.plist 中添加基于视图控制器的状态栏外观选项,并将其设置为"是">
- 覆盖每个视图控制器中要显示/隐藏状态栏的
var prefersStatusBarHidden: Bool
override var prefersStatusBarHidden: Bool {
return true
}
如果你想动态显示/隐藏它(例如,在点击按钮后(,你可以做这样的事情:
var statusBarHidden = true {
didSet {
setNeedsStatusBarAppearanceUpdate()
}
}
override var prefersStatusBarHidden: Bool {
return statusBarHidden
}
你可以在这里找到更详细的解释 这里
同样在 Apple 文档
UIStatusBarManager
中,您可以找到以下引用:
不要使用此对象来修改状态栏的配置。相反,您可以为每个 UIViewController 对象单独设置状态栏配置。例如,要修改状态栏的默认可见性,请覆盖视图控制器的 prefersStatusBarHidden 属性。