在一个我以模态方式呈现的 ViewController 中,我进行了以下操作:
override func prefersStatusBarHidden() -> Bool {
return true
}
这曾经有效,但现在不再有效。如何最好地隐藏状态栏,仅针对此视图控制器?
在一个我以模态方式呈现的 ViewController 中,我进行了以下操作:
override func prefersStatusBarHidden() -> Bool {
return true
}
这曾经有效,但现在不再有效。如何最好地隐藏状态栏,仅针对此视图控制器?
对于Swift 3和Swift 4,覆盖变量的方式已更改,如下所示:
override var prefersStatusBarHidden: Bool {
return true
}
如果您希望在视图控制器已经显示后“更新”状态,您需要调用以下方法:setNeedsStatusBarAppearanceUpdate()
请参考文档。对于 Swift 3 和 Swift 4.2 版本,当视图将要出现时
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
当视图要消失时
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.isStatusBarHidden = false
}
可能需要在您的 info.plist 文件中设置下一行:
View controller-based status bar appearance = NO
isStatusBarHidden
在 iOS 9.0 中已被弃用。 - msmq在您的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
}
在iOS 9、Xcode 7、Swift 2.0中,它回到了以前的状态。
override func prefersStatusBarHidden() -> Bool {
return true
}
实际上,Xcode会告诉你这一点
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)
已被弃用,建议您使用prefersStatusBarHidden方法。
对于 Swift 3,
override var prefersStatusBarHidden: Bool{
return true
}
并添加 viewDidLoad()
self.modalPresentationCapturesStatusBarAppearance = true
var statusBarState = false
override var prefersStatusBarHidden: Bool{
return statusBarState
}
在viewWillAppear中
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
statusBarState = true
UIView.animate(withDuration: 0.30) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
对于那些仍在苦苦挣扎的人,以下方法适用于iOS9。
通过从您的单个子/孙视图控制器调用它来更新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]];
}
无需编辑 .plist 文件。并且 AppStore 将会批准它。
(UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow)?.isHidden = false
public func ShowStatusBar() {
let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
UIView.animate(withDuration: 0.3) {
statusBarWindow?.alpha = 1
}
}
public func HideStatusBar() {
let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow
UIView.animate(withDuration: 0.3) {
statusBarWindow?.alpha = 0
}
}