In a ViewController, which I presented modally, I did this:
override func prefersStatusBarHidden() -> Bool {
return true
}
This used to work, but it no longer works. What's the best way to hide the status bar only for this view controller?
In a ViewController, which I presented modally, I did this:
override func prefersStatusBarHidden() -> Bool {
return true
}
This used to work, but it no longer works. What's the best way to hide the status bar only for this view controller?
For Swift 3 & Swift 4 it has changed to overriding a variable like this:
override var prefersStatusBarHidden: Bool {
return true
}
If you want to "Update" the state once the view controller is already being displayed, you will need to call:
setNeedsStatusBarAppearanceUpdate()
Please refer to the documentation.
For Swift 3 and Swift 4.2 when view going to Appear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
when view goint to Dissapear
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.isStatusBarHidden = false
}
It's possible you need set in your info.plist, next line:
View controller-based status bar appearance = NO
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
}
In iOS 9, Xcode 7, Swift 2.0, it's back to how it was previously.
override func prefersStatusBarHidden() -> Bool {
return true
}
In fact Xcode will tell you that
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)
has been deprecated and that you should use the prefersStatusBarHidden method.
For Swift 3,
override var prefersStatusBarHidden: Bool{
return true
}
and add viewDidLoad()
self.modalPresentationCapturesStatusBarAppearance = true
You can achieve this by simply overriding prefersStatusBarHidden
property in your ViewController as shown below :
override var prefersStatusBarHidden: Bool {
return true
}
This works for Swift 3/4.
Hide Status Bar smoothly by just using UIAnimation and stored property.
Swift 3+
var statusBarState = false
override var prefersStatusBarHidden: Bool{
return statusBarState
}
And then in viewWillAppear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
statusBarState = true
UIView.animate(withDuration: 0.30) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
For those still struggling, the below works for iOS9.
You update the rootViewController prefersStatusBarHidden function by calling it from your individual child/grandchild viewControllers. This works where you add childViewControllers directly to your rootViewController.
You don't need to set anything in the info.plist, but setting setting 'statusBarIsInitiallyHidden' works independently of the below.
First, in your rootViewController, add the following:
-(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;
}
Then, in the single view controller where you want to hide the status bar, call this:
-(void)viewDidLoad {
[[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:true]];
}
-(void)popSelf {
[[NSNotificationCenter defaultCenter] postNotificationName:@"kStatusBarAppearance" object:[NSNumber numberWithBool:false]];
}
No editing of .plist required. And AppStore will approve it
(UIApplication.shared.value(forKey: "statusBarWindow") as? UIWindow)?.isHidden = false
A late answer but if you need an alternative solution you can use this:
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
}
}
You can use
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
}
})
}
Use this code:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.isStatusBarHidden = true
}
if this code doesn't work, you need to add this key in the info.plist
View controller-based status bar appearance - NO
I'm using Xcode Version 9.2 / Swift 3.2 / iOS 11
I got this answer form BADCloud although I'm not sure why it didn't work for him.
Anyway it worked for me for a specific view controller.
The difference between this answer and the other answers on here is that in my info.plist
when I initially had View controller-based status bar appearance - NO with the 2 statusBar methods below it didn't work but when I changed it to Yes is worked with both of them.
In the info.plist
change:
View controller-based status bar appearance - YES
In the view controller you want it changed in add:
override func viewDidLoad() {
super.viewDidLoad()
// add this in ViewDidLoad
setNeedsStatusBarAppearanceUpdate()
}
// add this underneath ViewDidLoad
override var prefersStatusBarHidden: Bool {
return true
}
Complete solution for iOS 11 and Swift 4, giving you full control from your program.
var statusBarHidden : Bool?
override var prefersStatusBarHidden: Bool {
get {
if let status = statusBarHidden { return status } else { return false }
}
set(status) {
statusBarHidden = status
setNeedsStatusBarAppearanceUpdate()
}
}
Now you can simply show or hide the status bar by setting the property from your code. I tested it like this:
@IBAction func Show(_ sender: Any) {
prefersStatusBarHidden = false
}
@IBAction func Hide(_ sender: Any) {
prefersStatusBarHidden = true
}
Works like a charm.
UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None)
and when you want it back in a separate VC:
UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: .None)