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

时间:2019-09-27 12:29:54

标签: ios ios13 uiapplication uistatusbar

我做了以下常见的隐藏和再次显示状态栏的方法。在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对象。'

我该怎么做才能仅对某些视图控制器隐藏和显示状态栏?

1 个答案:

答案 0 :(得分:1)

如果要在其他View Controller上显示/隐藏状态栏,则需要:

  1. 在Info.plist中添加查看控制器基础状态栏外观选项,并将其设置为 YES
  2. 在每个要显示/隐藏状态栏的View Controller中覆盖var prefersStatusBarHidden: Bool
override var prefersStatusBarHidden: Bool { 
  return true 
} 

如果要动态显示/隐藏它(例如,点击按钮后),则可以执行以下操作:

var statusBarHidden = true {
  didSet {
    setNeedsStatusBarAppearanceUpdate()
  }
}

override var prefersStatusBarHidden: Bool { 
  return statusBarHidden 
}
  • 您可以在Here

  • 中找到更多详细的说明
  • 还可以在UIStatusBarManager的{​​{3}}中找到以下引号:

  

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