So I used to use:
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent
animated:YES];
to animate the status bar style change, from dark to light and vice versa
However this method is deprecated since iOS 9.
I do changed to use preferredStatusBarStyle
following @serenn's answer in preferredStatusBarStyle isn't called
It indeed can change the status bar style in old fashion, but without animations.
The documentation said:
If the return value from this method changes, call the setNeedsStatusBarAppearanceUpdate method.
However I have no idea where to call it, I tried put it in viewWillAppear, but no luck.
preferredStatusBarUpdateAnimation
remains as default:UIStatusBarAnimationFade
So I am confused. Looking for answers for how to animate as the deprecated method. Thanks in advance!
Select the View and in the Attributes Inspector change the Background Color to Light Gray. Build and Run the Project. The default style of the status bar is dark content. The style of the status bar can be changed to a status bar with white content.
OK I have spent two hours searching and trying, figured it out:
First, you have to make sure your child view controller can control the status bar style in the navigation controller by overriding preferredStatusBarStyle
like @serenn's answer in preferredStatusBarStyle isn't called
In order to have animation, I have to return two different style before and after the view controller appears like below:
-(UIStatusBarStyle)preferredStatusBarStyle {
if (!viewAppeared)
return UIStatusBarStyleDefault;
else
return UIStatusBarStyleLightContent; // your own style
}
viewAppeared
is a BOOL to indicate if the viewWillAppear
is called:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
viewAppeared = YES;
[UIView animateWithDuration:0.8 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];
}
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
viewAppeared = NO;
}
So when the view controller does not appear, the status bar style is UIStatusBarStyleDefault
and will be changed to UIStatusBarStyleLightContent
in viewWillAppear
.
Then call setNeedsStatusBarAppearanceUpdate
to update the change like below, be noted animateWithDuration
is a must to have animation.
[UIView animateWithDuration:0.8 animations:^{
[self setNeedsStatusBarAppearanceUpdate];
}];
I used to find out you don't have to call preferredStatusBarStyle
first like below, setNeedsStatusBarAppearanceUpdate
will invoke preferredStatusBarStyle
again:
[UIView animateWithDuration:0.8 animations:^{
[self preferredStatusBarStyle];
[self setNeedsStatusBarAppearanceUpdate];
}];
Though this solution solve the problem, I don't choose to use it for now. I can have the same result with only one line code but it is now way too many of the code I have to write. The deprecated API does not even trigger a warning right now, so until Apple keeps pushing me to change, I will not use this way. When the time comes I hope there is a good solution then.
I am very confused why Apple deprecated the one-line code ([UIApplication sharedApplication] setStatusBarStyle]...
)that can do all the tricks, but use a more complicated to achieve the same result. Even you want to give more fine-grained control, Apple does not have to deprecated the old one.
But maybe I just didn't find the best one right now. Hope someone could enlight me.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With