Я пробовал много способов установить стиль строки состояния (по умолчанию или lightcontent), но не могу заставить его работать для каждого контроллера представления. Я могу установить стиль строки состояния только для всего приложения.
Есть у кого-нибудь подсказка?
Я старался UIViewControllerBasedStatusBarAppearance
и
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
но эти методы не работают.
ios
cocoa-touch
Ван Ду Тран
источник
источник
Ответы:
Вы пробовали это?
Установите "Просмотр внешнего вида строки состояния на основе контроллера" (
UIViewControllerBasedStatusBarAppearance
)YES
в свой Info.plist. (YES
является значением по умолчанию, поэтому вы также можете просто не указывать это значение в своем списке.)В вашем методе viewDidLoad вызовите
[self setNeedsStatusBarAppearanceUpdate]
.Реализуйте
preferredStatusBarStyle
, возвращая стиль строки состояния, который вы хотите для этого контроллера представления.- (UIStatusBarStyle) preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
источник
Здесь есть уловка, если ваш контроллер представления находится внутри автономного UINavigationController, а не является частью UINavigationController, основанного на раскадровке, тогда, прежде всего, все методы терпят неудачу. Я столкнулся с этой ситуацией, а затем, чтобы установить в строке состояния светлый стиль, я использовал следующие
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
Это отлично сработало для меня.
источник
UINavigationBar.barStyle
отменяетpreferredStatusBarStyle
. Независимо от того, как вы устанавливаетеpreferredStatusBarStyle
, один чертов `UINavigationBar.setBarStyle 'берет на себя все.РЕДАКТИРОВАТЬ: это решение устарело в iOS 9. Выберите один из других ответов.
С
UIViewControllerBasedStatusBarAppearance
установлен в NO, я был в состоянии установить стиль для белого текста с помощью:[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
Это связано с тем, что цвет текста в этом стиле был белым в iOS 6 и ниже.
ОБНОВЛЕНИЕ: согласно @jowie, вы можете попробовать это на iOS8:
[UIApplication sharedApplication].statusBarStyle = UIBarStyleBlack;
источник
UIBarStyleBlack
.В Swift я смог сделать это, написав:
let tbc : UITabBarController = self.window?.rootViewController as UITabBarController var moreViewController : UINavigationController = tbc.moreNavigationController moreViewController.navigationBar.barStyle = UIBarStyle.Black
В основном вас интересует последняя строка.
В результате панель вкладок стала белой:
Обратите внимание, что я ничего не менял
Info.plist
, чтобы добиться этого результата.Для получения дополнительной информации об изменении
Navigation Status Bar
перейдите по этой ссылке: http://www.appcoda.com/customize-navigation-status-bar-ios-7/источник
В методе viewDidLoad поместите это:
Цель C
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; [self setNeedsStatusBarAppearanceUpdate];
Swift
UIApplication.shared.statusBarStyle = .lightContent self.setNeedsStatusBarAppearanceUpdate()
источник
AppDelegate
), либо для каждого контроллера представления.Готов поспорить, у вас есть контроллер представления, встроенный в контроллер навигации. Чтобы избежать настройки стиля панели навигации для
.Black
использования этого подкласса: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
Цель C:
добавьте это к
controller.m
методу viewDidLoad файла:[self setNeedsStatusBarAppearanceUpdate].
затем реализуйте этот метод в том же
controller.m
файле:- (UIStatusBarStyle) preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
Официальные документы:
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/Bars.html
Статья, которую я написал в своем блоге:
http://www.ryadel.com/2015/03/04/xcode-set-status-bar-style-and-color-in-objective-c/
источник
В ViewController, который вы хотите изменить цвет строки состояния
- (void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault]; } - (void) viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; }
источник
Быстрое расширение для этого, потому что я всегда забываю, как это работает
extension UIViewController { // utility to set the status bar appearance // Note: Make sure "View controller-based status bar appearance" is set to NO in your target settings or this won't work func setStatusBarForDarkBackground(dark: Bool) { UIApplication.sharedApplication().statusBarStyle = dark ? .LightContent : .Default setNeedsStatusBarAppearanceUpdate() } }
источник
Xcode 10.3,
В iPhone 8 12.4 Simulator все нормально.
В iPhone X 12.4 Simulator я пробовал все вышеперечисленное, не все в порядке.
Потом добавляю вручную, статус бар состоит из времени, батареи, сотовой связи.
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 } }
источник