UIStatusBarStyle не работает в Swift

85

Я пытаюсь изменить цвет строки состояния в моем приложении Swift на белый, но натыкаюсь на кирпичную стену. У меня есть 3 ViewController, каждый из которых встроен в NavigationController (может ли это быть проблемой? Я уже пытался разместить код в классе NavigationController.) Я пробовал оба следующих фрагмента кода в didFinishLaunchingWithOptions моего AppDelegate .swift, но ни один из них не работал.

application.statusBarStyle = .LightContent

а также

UIApplication.sharedApplication().statusBarStyle = .LightContent

Все, что говорят об этом в документации, - это то, что UIBarButtonStyle является Int и дал мне этот фрагмент перечисления, который мне совсем не помог с внедрением.

enum UIStatusBarStyle : Int {
    case Default
    case LightContent
    case BlackOpaque
}

Что мне не хватает?

Дэвидрейовенс
источник

Ответы:

145

У вас есть два варианта.

Если вы хотите продолжить ручную настройку стиля строки состояния, продолжайте делать то, что делаете, но вам нужно будет добавить следующий ключ в ваш файл info.plist со значением NO.

Просмотр внешнего вида строки состояния на основе контроллера

Или, если вы хотите продолжать использовать внешний вид строки состояния на основе контроллера представления, вместо установки statusBarStyle приложения переопределите preferredStatusBarStyleсвойство в каждом контроллере представления, для которого вы хотите указать стиль строки состояния.

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Мик МакКаллум
источник
Я пробовал этот код ... но у меня отображается только белая строка состояния на первом экране .. У меня нет строки состояния для остальных экранов :( .. любая помощь?
Рахул
7
Вы должны установить настройку «Просмотр внешнего вида строки состояния на основе контроллера» в вашем списке на ДА.
StackUnderflow
1
Это только в том случае, если вы хотите использовать внешний вид строки состояния на основе контроллера представления.
Сэм Холмс,
4
в iOS 10 (Swift 3.0) это уже не метод, а свойство. См .: stackoverflow.com/questions/38862208/…
stevo.mit
только для одного экрана
Oubaida AlQuraan
143

Swift 3.0

в AppDelegate.swift сделалFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

в AppDelegate.swift сделалFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO
Маселко
источник
1
Это идеальный ответ :)
Джей Маю,
1
Прекрасный ответ. Коротко и мило.
Мехул
3
извините, это может быть самый простой ответ, но он определенно не САМЫЙ ЛУЧШИЙ: потому что он просто устанавливает этот стиль для всех и любых viewControllers в приложении. Это поведение было введено для обеспечения более точного управления и применения различных настроек на основе различных контроллеров представления (например, смешивание светлого и темного содержимого).
auco
Это странно - не то, что говорится в документации Apple, но это работает. Пробовал множество других способов, включая строку состояния на основе UIViewController, ни один из них не работал.
n13
33

Вам необходимо установить:

navigationController.navigationBar.barStyle = .black

и текст будет белым

Нико С.
источник
1
Благодарность! Был ничего не помогло даже это переопределение функ preferredStatusBarStyle () -> UIStatusBarStyle {возвращение UIStatusBarStyle.LightContent} это действительно помогает: navigationController.navigationBar.barStyle = .BlackTranslucent navigationController.navigationBar.translucent = истина
Светлане
Спасибо! Ты спас мне день. Однако BlackTranslucent устарел. Следовательно, я использовал navigationController.navigationBar.barStyle = .Black
hsusmita
Он отлично работает с override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }. Вам просто нужно написать эту строку, viewDidLoadчтобы хорошо работать. Обязательно придерживайтесь View controller-based status bar appearance = YESэтого раствора.
Bhavin_m
кажется излишеством ... просто попробовал и работал вот так в файле Info.plist: 1. Стиль строки состояния -> UIStatusBarStyleLightContent 2. Просмотр внешнего вида строки состояния на основе контроллера -> НЕТ
raistlin
21

Для iOS9.x и Xcode7 просто поместите это внутрь AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().barStyle = .Black

} 

Это автоматически изменит стиль вашей строки состояния .Lightcontentна все контроллеры представления внутри UINavigationController.

(Также удалите View controller-based status bar appearanceиз Info.plist, чтобы подавить предупреждения, которые вы, вероятно, тоже видите!)

Biodave
источник
Спасибо. Похоже, в iOS9 есть серьезная ошибка. Это был единственный способ превратить строку состояния в начальный белый цвет VC. Все перепробовала. Я запрошу радар.
1b0t
ПредпочитаемыйStatusBarStyle возвращает UIStatusBarStyleDefault, но не обновляет lightcontent до darkcontent для конкретного контроллера представления. После self.navigationController.navigationBar.barStyle = UIBarStyleDefault; in viewWillAppear работал у меня. Надеюсь, этот комментарий поможет другим.
Pandey_Laxman
Обратите внимание, что UIStatusBarStyle был изменен на ".black" (строчная B) в Swift 3
brycejl
16

В Swift 3 стиль строки состояния был изменен на вычисляемое свойство в UIViewController, которое вы можете переопределить следующим образом:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 
Эрик Веландер
источник
13

В iOS 9 следующее (setStatusBarStyle) устарело, и вы получите предупреждение, если вы пойдете по этому пути.

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

Если вы хотите, чтобы все строки состояния были изменены за один раз, попробуйте добавить следующее в свой Info.plist. Строка состояния экрана запуска также станет белой. Хотя приведенный выше код не будет.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
GuiSoyСоус
источник
Подход .plist правильный, но setStatusBarStyle () не нужен. 'setStatusBarStyle (_: animated :)' устарел в iOS 9.0: Использование - [UIViewController preferredStatusBarStyle]
Билл Чан
@BillChan благодарит за комментарий, но, пожалуйста, прочтите ответ. Я уже объяснил, что setStatusBarStyle устарел. Если вы хотите, чтобы тот или иной viewController был изменен, вам следует использовать предпочтительныйStatusBarStyle. Подход plist предназначен для тех, кто хочет, чтобы все viewController изменились за один раз. Здесь нет правильного или неправильного. Просто вопрос того, чего вам нужно достичь.
GuiSoySauce
1
UIStatusBarStyle = UIStatusBarStyleLightContent (в .plist) помог моему приложению запуститься с белым текстом строки состояния ... Спасибо !!!
Крис Аллинсон
10

для меня все вышеперечисленное не работает, пока я не добавлю:

self.navigationController?.navigationBar.barStyle = .black;

так:

  1. Набор UIViewControllerBasedStatusBarAppearanceдля YESв.plist
  2. В viewDidLoadвызовеself.setNeedsStatusBarAppearanceUpdate();
  3. Переопределить предпочтительныйStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. В переопределенном методе я также установил navigationBar.barStyleso final
    для светлого содержимого:
    override var preferredStatusBarStyle: UIStatusBarStyle { self.navigationController?.navigationBar.barStyle = .black;//or default return .lightContent //or default }
    а для черного содержимого используйте значение по умолчанию

Источник отсюда и здесь .

и если это не сработает, вы можете попробовать добавить UINavigationController extension:

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        if let lastVC = self.viewControllers.last
        {
            return lastVC.preferredStatusBarStyle
        }

        return .default
    }
}
Константин Сауленко
источник
1
Без комментариев к стилю панели навигации ... но в Swift 3, Xcode 8 - это было единственное решение, которое сработало для меня.
Despotovic
Единственный недостаток, который я заметил, это то, что со всеми этими шагами он меняется, но без анимации
Лукаш 'Severiaan' Грела
6

Странно, используя Swift 3.1 и XC8.2.1, но все вышеперечисленное не сработало.

То, что я сделал, просто

extension UINavigationController
{
    override open var preferredStatusBarStyle: UIStatusBarStyle {
        get {
            return .lightContent
        }
    }
}

Ни Plist, ни прочего. HTH

Лорд iPhonius
источник
Также работает для Swift 4.2.
zeeshan
2

В Swift 3.0 вы можете переопределить геттер в ViewController для отображения строки состояния на основе контроллера:

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}
Денис Крешихин
источник
1

Не редактируйте свой Info.plist. Добавьте это в свой ViewController.swift:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
Сев
источник
1

Шаг 1. Добавьте в info.plist View controller-based status bar appearance -> NO

Шаг 2. Добавьте код в метод, в котором вам нужно изменить цвет строки состояния:

UIApplication.shared.statusBarStyle = .lightContent //(or .default)
setNeedsStatusBarAppearanceUpdate()

Ключевая строка кода: setNeedsStatusBarAppearanceUpdate()

Игорь
источник