如何隐藏iOS 9中单个视图控制器的状态栏?

在我以模态方式呈现的ViewController中,我这样做了:

override func prefersStatusBarHidden() -> Bool { return true } 

这曾经工作,但不再有效。 只有这个视图控制器隐藏状态栏的最好方法是什么?

对于Swift 3Swift 4,它已经改变为重写一个像这样的variables:

 override var prefersStatusBarHidden: Bool { return true } 

如果你想在视图控制器已经被显示的时候“更新”状态,你将需要调用:

 setNeedsStatusBarAppearanceUpdate() 

请参阅文档 。

对于Swift 3和Swift 4,当视图出现时

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.isStatusBarHidden = true } 

当查看goint到Dissapear

 override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) UIApplication.shared.isStatusBarHidden = false } 

在iOS 9,Xcode 7,Swift 2.0中,它回到了以前的样子。

 override func prefersStatusBarHidden() -> Bool { return true } 

事实上,Xcode会告诉你

 UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 

已被弃用,您应该使用prefersStatusBarHidden方法。

在你的UIViewController中:

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) UIApplication.shared.isStatusBarHidden = true } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) //It will show the status bar again after dismiss UIApplication.shared.isStatusBarHidden = false } override var prefersStatusBarHidden: Bool { return true } 

对于Swift 3,

 override var prefersStatusBarHidden: Bool{ return true } 

并添加viewDidLoad()

 self.modalPresentationCapturesStatusBarAppearance = true 

您可以使用

 override public func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) // hide status bar dispatch_async(dispatch_get_main_queue(), { if let window = UIApplication.sharedApplication().keyWindow { window.windowLevel = UIWindowLevelStatusBar + 1 } }) } override public func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) // Show status bar dispatch_async(dispatch_get_main_queue(), { if let window = UIApplication.sharedApplication().keyWindow { window.windowLevel = UIWindowLevelNormal } }) } 

对于那些仍在苦苦挣扎的人来说,下面的作品适用于iOS9。

您可以通过从您的个人/子孙viewControllers调用它来更新rootViewController prefersStatusBarHidden函数。 这适用于将childViewControllers直接添加到rootViewController的地方。

你不需要在info.plist中设置任何东西,但是设置设置'statusBarIsInitiallyHidden'独立于下面的工作。

首先,在你的rootViewController中添加如下内容:

 -(void)viewDidLoad { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateStatusBarAppearance:) name:@"kStatusBarAppearance" object:nil]; } -(void)updateStatusBarAppearance:(NSNotification *)n { statusBarIsHidden = [n.object boolValue]; [self setNeedsStatusBarAppearanceUpdate]; } -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; //optional } -(BOOL)prefersStatusBarHidden{ return statusBarIsHidden; } 

然后,在要隐藏状态栏的单个视图控制器中,调用以下命令:

 -(void)viewDidLoad { [[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:true]]; } -(void)popSelf { [[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:false]]; } 

使用此代码:

 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.isStatusBarHidden = true } 

如果此代码不起作用,则需要在info.plist中添加此密钥

查看基于控制器的状态栏外观 – NO

 UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 

当你想把它放回一个独立的VC时:

 UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .None)