I tried many ways to set the status bar style (default or lightcontent) but can\'t get it to work on a per view controller basis. I can set the status bar style for the
I bet you have your view controller embedded into a navigation controller. To avoid setting the navigation bar's style to .Black use this subclass:
class YourNavigationController: UINavigationController {
override func childViewControllerForStatusBarStyle() -> UIViewController? {
return topViewController
}
}
Swift:
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController
moreViewController.navigationBar.barStyle = UIBarStyle.Black
Objective C:
append this to the controller.m file viewDidLoad method:
[self setNeedsStatusBarAppearanceUpdate].
then implement this method in that same controller.m file:
- (UIStatusBarStyle) preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
Official docs:
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html
Article I wrote on my blog:
http://www.ryadel.com/2015/03/04/xcode-set-status-bar-style-and-color-in-objective-c/
In Swift I was able to do this by writing:
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController
var moreViewController : UINavigationController = tbc.moreNavigationController
moreViewController.navigationBar.barStyle = UIBarStyle.Black
Basically you're interested in the last line.
This resulted in tabbar changing to white:

Note that I didn't change anything in Info.plist in order to achieve this result.
For more informations regarding changing Navigation Status Bar, please check out this link:
http://www.appcoda.com/customize-navigation-status-bar-ios-7/
Xcode 10.3,
In iPhone 8 12.4 Simulator, it is OK.
In iPhone X 12.4 Simulator, I tried all above, not OK.
Then I add it by hand, status bar consists of time, battery, cellular.
StatusBarView
class StatusBottomView: UIView {
private var batteryView:BatteryView!
private var timeLabel:UILabel!
private var timer:Timer?
override init(frame: CGRect) {
super.init(frame: frame)
addSubviews()
}
private func addSubviews() {
batteryView = BatteryView()
batteryView.tintColor = UIColor.blue
addSubview(batteryView)
timeLabel = UILabel()
timeLabel.textAlignment = .center
timeLabel.font = UIFont.systemFont(ofSize: 12)
timeLabel.textColor = UIColor.blue
addSubview(timeLabel)
didChangeTime()
addTimer()
}
override func layoutSubviews() {
super.layoutSubviews()
let h = frame.size.height
let x: CGFloat = 80
batteryView.frame.origin = CGPoint(x: ScreenHeight - x - DZMBatterySize.width, y: (h - DZMBatterySize.height) / 2)
timeLabel.frame = CGRect(x: x, y: 0, width: 50, height: h)
}
// MARK: -- Timer
func addTimer() {
if timer == nil {
timer = Timer.scheduledTimer(timeInterval: 15, target: self, selector: #selector(didChangeTime), userInfo: nil, repeats: true)
RunLoop.current.add(timer!, forMode: .common)
}
}
func removeTimer() {
if timer != nil {
timer!.invalidate()
timer = nil
}
}
@objc func didChangeTime() {
timeLabel.text = TimerString("HH:mm")
batteryView.batteryLevel = UIDevice.current.batteryLevel
}
}
BatteryLevelView
class BatteryView: UIImageView {
override var tintColor: UIColor! {
didSet{ batteryLevelView.backgroundColor = tintColor }
}
/// BatteryLevel
var batteryLevel:Float = 0 {
didSet{ setNeedsLayout() }
}
/// BatteryLevelView
private var batteryLevelView:UIView!
convenience init() {
self.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height))
}
override init(frame: CGRect) {
super.init(frame: CGRect(x: 0, y: 0, width: DZMBatterySize.width, height: DZMBatterySize.height))
addSubviews()
}
func addSubviews() {
batteryLevelView = UIView()
batteryLevelView.layer.masksToBounds = true
addSubview(batteryLevelView)
image = UIImage(named: "battery_black")?.withRenderingMode(.alwaysTemplate)
tintColor = UIColor.white
}
override func layoutSubviews() {
super.layoutSubviews()
let spaceW:CGFloat = 1 * (frame.width / DZMBatterySize.width) * HJBatteryLevelViewScale
let spaceH:CGFloat = 1 * (frame.height / DZMBatterySize.height) * HJBatteryLevelViewScale
let batteryLevelViewY:CGFloat = 2.1*spaceH
let batteryLevelViewX:CGFloat = 1.4*spaceW
let batteryLevelViewH:CGFloat = frame.height - 3.4*spaceH
let batteryLevelViewW:CGFloat = frame.width * HJBatteryLevelViewScale
let batteryLevelViewWScale:CGFloat = batteryLevelViewW / 100
var tempBatteryLevel = batteryLevel
if batteryLevel < 0 {
tempBatteryLevel = 0
}else if batteryLevel > 1 {
tempBatteryLevel = 1
}
batteryLevelView.frame = CGRect(x: batteryLevelViewX , y: batteryLevelViewY, width: CGFloat(tempBatteryLevel * 100) * batteryLevelViewWScale, height: batteryLevelViewH)
batteryLevelView.layer.cornerRadius = batteryLevelViewH * 0.125
}
}
There is a catch here if your view controller is inside standalone UINavigationController and not a part of Storyboard based UINavigationController then above all methods fail. I came across this situation and then in order to set the status bar to light style i used following
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
This worked perfectly for me.
Have you tried this?
Set "View controller-based status bar appearance" (UIViewControllerBasedStatusBarAppearance) to YES in your Info.plist. (YES is the default, so you can also just leave this value out of your plist.)
In your viewDidLoad method, call [self setNeedsStatusBarAppearanceUpdate].
Implement preferredStatusBarStyle, returning the status bar style that you want for this view controller.
- (UIStatusBarStyle) preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}