Изменение цвета строки состояния для конкретных ViewControllers с помощью Swift в iOS8
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent;
}
используя приведенный выше код в любом ViewController, чтобы установить цвет строки состояния в белый для конкретного viewcontroller не работает в iOS8 для меня. Есть предложения? Используя UIApplication.sharedApplication метод, цвет меняется после необходимых изменений в информации.plist для всего приложения.
// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent
Как я могу просто внести изменения в цвет строки состояния для некоторых необходимых и конкретные ViewControllers?
24 ответов:
прочитав все предложения и попробовав несколько вещей, я мог бы заставить это работать для конкретных viewcontrollers, используя следующие шаги:
Первый Этап:
откройте свою информацию.plist и вставляем новый ключ с именем " внешний вид строки состояния на основе контроллера" к нет
второй шаг (просто объяснение, не нужно осуществлять это):
обычно мы помещаем следующий код в приложение (_: didFinishLaunchingWithOptions:) метод AppDelegate,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContentSwift 3
UIApplication.shared.statusBarStyle = .lightContentа то влияет
statusBarStyleиз всех ViewControllers.Итак, как заставить это работать для конкретных ViewControllers-Final Шаг:
откройте файл viewcontroller, в котором вы хотите изменить
statusBarStyleи поместите следующий код вviewWillAppear(),Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContentSwift 3
UIApplication.shared.statusBarStyle = .lightContentкроме того, использовать тег
viewWillDisappear()метод для этого конкретного viewController и поставить следующие строки кода,Swift 2
override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default }Swift 3
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) UIApplication.shared.statusBarStyle = UIStatusBarStyle.default }этот шаг сначала изменит
statusBarStyleдля конкретного viewcontroller, а затем измените его обратно наdefaultкогда конкретный viewcontroller исчезает. Не реализуяviewWillDisappear()изменитьstatusBarStyleпостоянно к новому определенному значениюUIStatusBarStyle.LightContent
(по состоянию на 23 мая 2018 года)
Swift 3 и Swift 4
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIApplication.shared.statusBarStyle = .lightContent } override var preferredStatusBarStyle : UIStatusBarStyle { return .lightContent }
я следовал этому учебнику, и это сработало для меня. Однако я не уверен, есть ли какие-либо предостережения.
https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift
- откройте свою информацию.plist и установить
UIViewControllerBasedStatusBarAppearanceдоfalse.- в первой функции в
AppDelegate.swift, которая содержитdidFinishLaunchingWithOptions, установите цвет, который вы хотите.
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
Swift 3 Обновление*
UIApplication.общий.statusBarStyle = .lightContent
в вашей информации.plist вам нужно определить внешний вид строки состояния на основе контроллера для любого значения.
Если вы определяете его да, то вы должны переопределить preferredStatusBarStyle функцию в каждом контроллере вида.
Если вы определяете его нет, то вы можете установить стиль в AppDelegate с помощью
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
override func viewWillAppear(animated: Bool) { self.navigationController?.navigationBarHidden = true UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContent let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView if statusBar.respondsToSelector("setBackgroundColor:") { statusBar.backgroundColor = UIColor.redColor() } }
здесь есть миллиард ответов, поэтому я подумал, почему бы не добавить еще один в виде расширение (С помощью @Cœur)
Swift 3
:extension UIApplication { class var statusBarBackgroundColor: UIColor? { get { return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor } set { (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue } } }реализация:
UIApplication.statusBarBackgroundColor = .blue
SWIFT 2
мне удалось успешно изменить внешний вид фона строки состояния, добавив в мой viewWillAppear следующее:
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView if statusBar.respondsToSelector(Selector("setBackgroundColor:")) { statusBar.backgroundColor = .redColor() }
Swift 3
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) { statusBar.backgroundColor = UIColor.black }это решение для установки цвета фона строки состояния для конкретного контроллера вида.
реализовать
preferredStatusBarStyleКак вы упомянули, и называютself.setNeedsStatusBarAppearanceUpdate()inViewDidLoadи также В Инфо.plist setUIViewControllerBasedStatusBarAppearanceдоYES(этоYESпо умолчанию)непонятно, почему это не работает.Мне нужно проверить код.Еще одно предложение: перейти с рабочим кодом в
viewDidLoadUIApplication.sharedApplication().statusBarStyle = .LightContentи измените это на значение по умолчанию, когда вы просматриваете get disappearedviewWillDisappear.
в моей ситуации, я использую раскадровку, чтобы организовать мои контроллеры вида.Я хочу изменить весь стиль строки состояния.
вы можете увидеть на рисунке ниже.
Starsконтроллер вида-этоCPBaseNavigationControllerиCPBaseNavigationController- это подклассUINavigationController.я пытаюсь сделать следующие наборы:
на
AppDelegate.swiftfuncdidFinishLaunchingWithOptionsдобавьте//change status bar color UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContentно нет эффект.
в раскадровке, найти
Base Tab BarController(картинка выше).выберитеAttributes InspectorизменитьSattus BarатрибутLight Content. так плохо, никакого эффекта.
последнее, что я получаю it.In мой пользовательский навигационный контроллер
CPBaseNavigationControllerдобавить кнопку funcpreferredStatusBarStyleoverride func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent }он работает хорошо!
кроме того,
statusBarStyledeprecated в 9.0,вы можете использовать-[UIViewController preferredStatusBarStyle].
для swift 3
.файл plist
View controller-based status bar appearance = NOAppDelegate.Свифт
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Custom statubar UIApplication.shared.isStatusBarHidden = false UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView statusBar.backgroundColor = UIColor.gray return true }
работает для навигации на основе приложения
var addStatusBar = UIView() addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20); addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9) self.window?.rootViewController?.view .addSubview(addStatusBar)
Swift 3
// // LoginController.swift // Swift 3 // // Created by The Crab on 17/01/2017. // Copyright © 2017 Paxi Labs. All rights reserved. // import UIKit class LoginController: UIViewController { override func viewDidLoad() { super.viewDidLoad() setNeedsStatusBarAppearanceUpdate() view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1) } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } }
в Swift 3.0 Xcode 8 все намного проще
используя код ниже в файле делегата приложения, после
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {вставить это:
UINavigationBar.appearance().barStyle = .black UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Я установил определенный цвет (в формате RGB), используя ниже код в
App Delegatefile:func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { . . . UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContent let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView if statusBar.respondsToSelector(Selector("setBackgroundColor:")) { statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0) } . . . }вы также должны добавить под ключ в
Info.plistfile:внешний вид строки состояния на основе контроллера с логическим значением нет
Swift 4 для конкретного ViewController без встроенного navigationViewController просто добавьте это в свой файл ViewController.
override var preferredStatusBarStyle : UIStatusBarStyle { return .lightContent }
Я могу предложить вам более простой способ,
- просто позвони setNeedsStatusBarAppearanceUpdate в viewDidLoad, как говорит Apple docs,
вызовите этот метод, если атрибуты строки состояния контроллера вида, такие как скрытый/нескрытый статус или стиль, изменяются. При вызове этого метода в блоке анимации изменения будут анимированы вместе с остальной частью блока анимации.
- выполнить preferredStatusBarStyle возврат предпочтительного типа.
он работал для меня в iOS 10.1.
С
[self setNeedsStatusBarAppearanceUpdate]; -(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }Свифт
setNeedsStatusBarAppearanceUpdate() var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }Я удивлена, что никто не указал на это. В любом случае, наслаждайтесь :)
у меня были некоторые проблемы с этим. Я действительно не чувствовал себя хорошо в глобальном изменении цвета строки состояния в поле зрения, а затем изменение его обратно в поле зрения исчезло, как принятый ответ. Верьте или нет вы можете сделать это путем переопределения
preferredStatusBarStyleна нужном контроллере вида. Через много времени это то, что я сделал, чтобы заставить его работать:
- изменить внешний вид строки состояния на основе контроллера вида в вашем
info.plist"да".- теперь любой полный контроллер вида экрана может изменить стиль строки состояния, переопределив
preferredStatusBarStyle.- Я указываю полный экран, потому что это не будет работать для (не полный экран) модальных контроллеров просмотра, не без настройки
modalPresentationCapturesStatusBarAppearanceДа что это.также, если у вас есть встроенные контроллеры вида, например, в навигационном контроллере, он попросит самый верхний контроллер вида для стиля строки состояния. Переопределение
childViewControllerForStatusBarStyleи передача встроенного контроллера вида должна работать, но это не для меня. Поэтому я просто вернул встроенные контроллеры представления предпочтительной строки состояния в качестве предпочтительного стиля строки состояния. Что-то вроде этого:override var preferredStatusBarStyle: UIStatusBarStyle { if let topViewController = viewControllers.last { return topViewController.preferredStatusBarStyle } return .default }
Обновление Swift 3.0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { UIApplication.shared.statusBarStyle = .lightContent return true }
нажмите на группу вспомогательных файлов (слева вверху-имя вашего проекта). Перейдите к информации. Нажмите на + где-то между списками, как показано ниже имя пакета. И добавить "вид контроллера на основе строки состояния appearence" и установить его в НЕТ. Затем откройте AppDelegate.swift и изменить следующим образом:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true) return true }вот и все.
Я буквально попал в такую же проблему. Мне потребовалось более 4 часов, чтобы понять это. Я попробовал все ответы, приведенные здесь, и лучшее, что я получил, это получить заголовок в строке состояния белого цвета. Но другие биты, такие как панель батареи и другие, все еще были черными, независимо от того, что я сделал: относительно применения всех решений, предусмотренных в этом вопросе. Поэтому я решил вернуться назад и узнал, что я загрузил зависимость CocoaPod, которая изменяла нормальные функции Xcode и коды менять цвет. Для меня это была" Хамелеонфрамовая " зависимость. Поэтому я бы посоветовал вам проверить свои зависимости, которые вы установили из CocoaPods, удалив самые последние, если вы применили все решения и не работаете на вас.
что работало со мной, в раскадровке перейдите к навигационному контроллеру, выберите Панель навигации, нажмите на инспектор атрибутов, затем измените стиль с default на black. Вот так!
Swift 3
в своем внутри
func applicationметодlet statusBar: UIView = application.value(forKey: "statusBar") as! UIView statusBar.backgroundColor = .red
Swift 4.0 пожалуйста, используйте этот код в "didFinishLaunchingWithOptions launchOptions:" Appdelegate class
UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){ statusBar.backgroundColor = UIColor.black }




Comments