preferredStatusBarStyle is not working
Here is Apple Guidelines/Instruction about status bar change.
If you want to set status bar style, application level then set UIViewControllerBasedStatusBarAppearance
to NO
in your .plist
file. And in your appdelegate
> didFinishLaunchingWithOptions
add following ine (programatically you can do it from app delegate).
Objective C
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
Swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
application.statusBarStyle = .lightContent
return true
}
if you want to set status bar style, at view controller level then follow these steps:
- Set the
UIViewControllerBasedStatusBarAppearance
toYES
in the.plist
file, if you need to set status bar style at UIViewController level only. In the viewDidLoad add function -
setNeedsStatusBarAppearanceUpdate
override preferredStatusBarStyle in your view controller.
Objective C
- (void)viewDidLoad
{
[super viewDidLoad];
[self setNeedsStatusBarAppearanceUpdate];
}
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Swift
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Set value of .plist according to status bar style setup level.
You can set background color for status bar during application launch or during viewDidLoad of your view controller.
extension UIApplication {
var statusBarView: UIView? {
return value(forKey: "statusBar") as? UIView
}
}
// Set upon application launch, if you've application based status bar
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
return true
}
}
or
// Set it from your view controller if you've view controller based statusbar
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
}
}
Here is result:
Sarah
Updated on July 05, 2022Comments
-
Sarah almost 2 years
I used to use
setStatusBarStyle
in my project and it works fine, but it is deprecated so I usepreferredStatusBarStyle
, that didn't work. knowing that I've:- Call the method setNeedsStatusBarAppearanceUpdate.
- Set "View controller-based status bar appearance" to NO in info.plist
Override the function
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
this function is not called
Note: I'm using navigation controller.
-
Steve over 5 yearsThis is the only thing that works for me and yet it is deprecated.
-
AfnanAhmad about 5 yearsIt doesn't work if the viewcontroller is wrapped in a UINavigationController
-
Scott almost 5 yearsif your application use navigationController,you should also implement childViewControllerForStatusBarStyle.
-
abhimanyu jindal almost 5 yearsI added my answer here, Please have a look. stackoverflow.com/a/56801660/299610