在我以模态方式呈现的ViewController中,我这样做了:
override func prefersStatusBarHidden() -> Bool {
return true
}
这曾经有用,但它不再有效。隐藏此视图控制器的状态栏仅的最佳方法是什么?
答案 0 :(得分:62)
Swift 3 & Swift 4 它已改为覆盖这样的变量:
override var prefersStatusBarHidden: Bool {
return true
}
如果您想在显示视图控制器后“更新”状态,则需要调用:
setNeedsStatusBarAppearanceUpdate()
请参阅documentation。
答案 1 :(得分:41)
对于 Swift 3和Swift 4.2 当视图出现时出现
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
查看去往Dissapear的goint
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.isStatusBarHidden = false
}
您可能需要在info.plist中设置,下一行:
View controller-based status bar appearance = NO
答案 2 :(得分:19)
在iOS 9,Xcode 7,Swift 2.0中,它回到了之前的状态。
override func prefersStatusBarHidden() -> Bool {
return true
}
实际上Xcode会告诉你
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)
已被弃用,您应该使用prefersStatusBarHidden方法。
答案 3 :(得分:19)
In your 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
}
答案 4 :(得分:10)
对于Swift 3,
override var prefersStatusBarHidden: Bool{
return true
}
并添加viewDidLoad()
self.modalPresentationCapturesStatusBarAppearance = true
答案 5 :(得分:4)
您只需在ViewController中覆盖 prefersStatusBarHidden
属性即可实现此目的,如下所示:
override var prefersStatusBarHidden: Bool {
return true
}
适用于Swift 3/4。
答案 6 :(得分:2)
对于那些仍在努力的人,以下适用于iOS9。
通过从您的各个子/孙视图控制器中调用rootViewController来更新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]];
}
答案 7 :(得分:2)
不需要编辑.plist。 AppStore会批准它
(UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow)?.isHidden = false
答案 8 :(得分:2)
一个较晚的答案,但是如果您需要替代解决方案,则可以使用以下方法:
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
}
}
答案 9 :(得分:1)
您可以使用
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
}
})
}
答案 10 :(得分:0)
适用于iOS 11和Swift 4的完整解决方案,让您可以完全控制您的程序。
var statusBarHidden : Bool?
override var prefersStatusBarHidden: Bool {
get {
if let status = statusBarHidden { return status } else { return false }
}
set(status) {
statusBarHidden = status
setNeedsStatusBarAppearanceUpdate()
}
}
现在,您只需通过设置代码中的属性即可显示或隐藏状态栏。我测试了这样:
@IBAction func Show(_ sender: Any) {
prefersStatusBarHidden = false
}
@IBAction func Hide(_ sender: Any) {
prefersStatusBarHidden = true
}
像魅力一样。
答案 11 :(得分:0)
我正在使用Xcode版本9.2 / Swift 3.2 / iOS 11
我得到了BADCloud这个答案,虽然我不确定为什么它对他不起作用。
无论如何,它对我来说是一个特定的视图控制器。
这个答案和其他答案之间的区别在于我info.plist
当我最初使用查看基于控制器的状态栏外观 - 否时,它下面有2个statusBar方法没有用,但当我把它更改为是时,它们都适用于它们。
在info.plist
更改中:
查看基于控制器的状态栏外观 - 是
在视图控制器中,您希望在添加中更改:
override func viewDidLoad() {
super.viewDidLoad()
// add this in ViewDidLoad
setNeedsStatusBarAppearanceUpdate()
}
// add this underneath ViewDidLoad
override var prefersStatusBarHidden: Bool {
return true
}
答案 12 :(得分:0)
只需使用UIAnimation和存储属性即可平滑地隐藏状态栏。
Swift 3 +
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()
}
}
答案 13 :(得分:-1)
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)
当你想要它回到一个单独的VC中时:
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .None)