Change status bar back to default after changing it to `Light`, per view Controller scenario - ios7

I want to be able to change the status bar color on a per view controller basis. My ViewController flow is A->B->C. The launch status bar color is black (in A), and I change it to white in view Controller B. I use the following in Bs viewDidLoad:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[self setNeedsStatusBarAppearanceUpdate];
Which works perfectly. However when I go back to ViewController A, it is white also. I tried using the following code to change it back but it doesnt work:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
[self setNeedsStatusBarAppearanceUpdate];
I also tried:
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
But its deprecated and doesnt work.
I have seen the other questions on SO about this, but they tell you how to change it but not change back to default.
Thanks in advance

Setting the navigation bar back to default in viewWillAppear did the trick.

Related

Status bar content color not working in VC iOS7

Ok so I know that this code worked in the first VC I used it in, but now it's not working in my remaining VC's
in viewDidLoad:
[self setNeedsStatusBarAppearanceUpdate];
method added in #implementation:
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
PS I have view controller-based status bar boolean set to YES in my MyProject-Info.plist
Also, my current problem shouldn't have anything to do with hierarchies b/c the second VC that I'm trying to use this code in has the exact same setup as the login page that I made it work on. Its a regular VC embedded in a Navigation Controller.
You have to set the defaults for the status bar's in all your ViewController's that'd you'd like to set 'white' to a black nav bar. This appears to be a sort of glitch with iOS7, but regardless, it works.

Cannot hide status bar in iOS7

I just upgraded my iPhone 5 iOS 7 to four beta version. Now when I run my app from Xcode 5 on this iPhone, status bar doesn’t hide, even though it should.
Not Working:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
Not Working:
[UIApplication sharedApplication].statusBarHidden = YES;
Can't login to Apple Developer Forums
in your apps plist file add a row call it "View controller-based status bar appearance" and set it to NO
Note that this simply does not work, if you are using UIImagePickerController in the app.
from http://www.openfl.org/developer/forums/general-discussion/iphone-5ios-7-cant-hide-status-bar/, mgiroux's solution
Add method in your view controller.
- (BOOL)prefersStatusBarHidden {
return YES;
}
In the Plist add the following properties.
-> Status bar is initially hidden = YES
-> View controller-based status bar appearance = NO
Add both - now the status bar will disappear.
To hide Status Bar on a Single view, you should use:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
At first, this didn't work for me, and then a saw in the documentation of this method that says:
// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
This has to be done on the plist file, adding the key View controller-based status bar appearance set to NO.
And then it worked.
In order to use the legacy UIApplication method to hide/show the status bar, your app must set a plist value for iOS 7:
View-Controller Based Status Bar Appearance = NO
This value is set to YES by default. If you change it to NO, you can use the legacy methods. If you leave it set to YES, you can still hide the status bar, but it's up to each view controller subclass in your app to override: prefersStatusBarHidden to return YES.
Any time your app needs the status bar appearance or visibility to change, and View-Controller Based Status Bar Appearance is set to YES, your outermost view controller needs to call:
setNeedsStatusBarAppearanceUpdateAnimation
To hide status bar in iOS7 you need 2 lines of code
inapplication:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions write
[application setStatusBarHidden:YES];
in info.plist add this
View-Controller Based Status Bar Appearance = NO
There are so many combinations suggested for this issue, but the problem is that iOS 6 and 7 use different methods to hide the status bar. I have never been successful setting the plist settings to enable the iOS6-style behaviour on iOS 7, but if you are building your app to support iOS 6+, you need to use 3 methods at once to ensure a particular view controller hides the status bar:
// for ios 7
- (BOOL)prefersStatusBarHidden{
return YES;
}
// for ios 6
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
// explicitly set the bar to show or it will remain hidden for other view controllers
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
This should work regardless of your plist settings.
I had to do both changes below to hide the status bar:
Add this code to the view controller where you want to hide the status bar:
- (BOOL)prefersStatusBarHidden
{
return YES;
}
Add this to your .plist file (go to 'info' in your application settings)
View controller-based status bar appearance --- NO
Then you can call this line to hide the status bar:
[[UIApplication sharedApplication] setStatusBarHidden:YES];
Just add these 2 lines in info.plist file. It will make the fix for iOS7 and older version both.
Status bar is initially hidden = YES
View controller-based status bar appearance = NO
Navigate to the project and select Targets -> General and see the "Status Bar style ...Hide during application launch" check box will be checked. This will work.
Try this simple method:
- (void)viewWillAppear:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}
- (void)viewWillDisappear:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}
The only thing that worked for me is to add the following in your plist
<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
The easiest method I've found for hiding the status bar throughout the entire app is by creating a category on UIViewController and overriding prefersStatusBarHidden. This way you don't have to write this method in every single view controller.
UIViewController+HideStatusBar.h
#import <UIKit/UIKit.h>
#interface UIViewController (HideStatusBar)
#end
UIViewController+HideStatusBar.m
#import "UIViewController+HideStatusBar.h"
#implementation UIViewController (HideStatusBar)
//Pragma Marks suppress compiler warning in LLVM.
//Technically, you shouldn't override methods by using a category,
//but I feel that in this case it won't hurt so long as you truly
//want every view controller to hide the status bar.
//Other opinions on this are definitely welcome
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (BOOL)prefersStatusBarHidden
{
return YES;
}
#pragma clang diagnostic pop
#end
In plist add ----
View controller-based status bar appearance --- NO
In each viewController write
- (void) viewDidLayoutSubviews
{
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = 20.0;
viewBounds.origin.y = -topBarOffset;
self.view.bounds = viewBounds;
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];//for status bar style
}
For status bar issue in iOS 7 but target should be 5.1 and above for the app
Many of the answers on this thread work, but it's my understanding if you're trying to do anything dynamic you'll eventually need to call:
[self performSelector:#selector(setNeedsStatusBarAppearanceUpdate)];
Steps For Hide the status bar in iOS 7:
1.Go to your application info.plist file.
2.And Set, View controller-based status bar appearance : Boolean NO
Hope i solved the status bar issue.....
For iOS 7 in a single view use in viewWillappear method:
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
For display the status bar use:
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO];
-(BOOL)prefersStatusBarHidden
{
return YES;
}
In Info Plist file Add a row for following property
Property Name : View controller-based status bar appearance
Value : NO
Try adding the following method to your app's root view controller:
- (BOOL)prefersStatusBarHidden
{
return YES;
}
I tried all these options posted here on my project and they would not work. I thought it could be to do with the fact I had updated my Xcode and then the app to iOS 7 and some settings had got messed up somewhere. I decided To build a completely new project for it and after simple just setting: "Status bar is initially hidden = YES" and "View controller-based status bar appearance = NO" as stated by many others it worked correctly (i.e. no status bar).
So my advice if you are working on a project which has been updated to iOS 7 from an old version and have tried all other options is to build a new project.
For 2019 ...
To make an app with NO status bars,
Click info.plist, right-click to "Add row".
Add these two, with these settings:
That's all there is to it.
You can check this code, pod UIViewController+ODStatusBar
For Swift 2.0+ IOS 9
override func prefersStatusBarHidden() -> Bool {
return true
}
To hide status bar for specific viewController
- (BOOL)prefersStatusBarHidden {
return YES;
}
For setting status bar Hidden for application:
set View controller-based status bar appearancetoNO in .plist
and in application: didFinishLaunchingWithOptions: set:
[application setStatusBarHidden:YES];
Note: setStatusBarHidden: deprecated
OR
in Project settings -> General Tab ->Deployment Info
Check Hide Status bar box.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
application.statusBarHidden = YES;
return YES;
}
I'm not sure why you "can't login to the Apple Developer Forums", but (without violating the NDA) you can also hide your statusBar through Xcode. It's a general setting on your application target.

setStatusBarOrientation:animated: not working in iOS 6

I've used this code to force an orientation change back to portrait when the user is finished watching the video (it allows viewing in landscape mode), before popping the video view controller off the navigation controller:
//set statusbar to the desired rotation position
[[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationPortrait animated:NO];
//present/dismiss viewcontroller in order to activate rotating.
UIViewController *mVC = [[[UIViewController alloc] init] autorelease];
[self presentModalViewController:mVC animated:NO];
[self dismissModalViewControllerAnimated:NO];
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
This worked perfectly until iOS 5.1.1. I've even tried to use the new present/dismiss methods after reading in another post that those should be used now:
[self presentViewController:mVC animated:NO completion:NULL];
[self dismissViewControllerAnimated:NO completion:NULL];
The problem is it doesn't work at all. After I rotated the video viewer to landscape and then pop it, my settings view (table view controller) comes back, but also in landscape mode.
I've even tried the tip from Here
"The setStatusBarOrientation:animated: method is not deprecated outright. However it now works only if the supportedInterfaceOrientations method of the topmost full screen view controller returns 0. This puts the responsibility of ensuring that the status bar orientation is consistent into the hands of the caller."
So I've experimented with setting a flag to force supportedInterfaceOrientations to return 0 (before calling the first code block above) but it doesn't work either.
Does anybody have a solution for this?
Thanks for your time and effort.
setStatusBarOrientation method has changed behaviour a bit. According to Apple documentation:
The setStatusBarOrientation:animated: method is not deprecated
outright. It now works only if the supportedInterfaceOrientations
method of the top-most full-screen view controller returns 0
Your root view controller should answer false to the method shouldAutorotate in order that your app responds to setStatusBarOrientation:animated
From Apple Documentation: "if your application has rotatable window content, however, you should not arbitrarily set status-bar orientation using this method"
To understand that, put a breakpoint in the shouldAutorotate method and you will see that it is called juste after setting the status bar orientation.
Here is how I fixed.
https://stackoverflow.com/a/14530123/1901733
The current question is linked with the question from the url above.
The statusBarOrientation is a real problem in ios6.

Hiding the status bar leaves a white space

Hiding the status bar leaves a white space that I do not know how to remove.
The code I use is noted below, I have tried putting it in different places with no luck.
-(void)viewWillAppear:(BOOL)animated
{
[[self navigationController] setNavigationBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
}
Any suggestions? Thanks
You're going to have to do these steps:
Go into the interface builder. Click on your view, and on the right interface bar, select the option from the dropdown menu:
Status Bar> None
Drag the rest of your things on your view up or whatever occupies the top of your view to account for the visible white space.
Now that the status bar in the interface builder is gone, you are able to account for it when you hide it programmatically.

Hide status bar for entire app

I create views programmatically. To hide status bar in view I use
[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
in viewDidload method. The problem is every view have to implement the code above to be status bar hidden. Is there a way (programmatically) to set status bar hidden just in one place in the app so entire app to be without the status bar ?
I have tried to add this in AppDelegate, but it doesn't work.
Open your app plist file MyApp-Info.plist and add a row with the Status bar is initially hidden and the YES value.
EDIT:
If you want to do it programmatically, add this in your ApplicationDidFinishLaunching :
[UIApplication sharedApplication].statusBarHidden = YES;
If you are targeting the devices with iOS > 3.2, then use the following code in application:didFinishLaunchingWithOptions: method in AppDelegate class.
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
just put key "Status bar is initially hidden" as YES in Info.plist file.
you will get hide status bar throughout the application.
If you want to do it by problematically, then just put this code in Appdelegate.m file of your project.
[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
Instead of creating new views based on UIView, subclass UIView (we can call it SummercView) and add a viewDidLoad method to it that looks like:
- (void) viewDidLoad
{
[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];
[super viewDidLoad];
}
And then in your xib or storyboard files, set the views where you want to hide the status bar to use SummercView instead of UIView.
And of course #Aadhira's answer is good, too. +1 to him/her.
Couldn't you create a view class which did this in viewDidLoad, and have your views be subclasses of it? They'd still each have to hide the status bar, but at least you wouldn't have to duplicate the code in each subclass.