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

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

application.statusBarStyle = .LightContent

и

UIApplication.sharedApplication().statusBarStyle = .LightContent

Все, что Docs должны сказать об этом, это то, что UIBarButtonStyle - это Int и дал мне этот фрагмент enum, который не помог мне вообще с имплиментацией.

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

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

Ответ 1

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

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

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

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

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

Ответ 2

Swift 3.0

в AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Swift 2.2

в AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

Info.plist

View controller-based status bar appearance -> NO

Ответ 3

Вы должны установить:

navigationController.navigationBar.barStyle = .black

и текст появится в белом

Ответ 4

Для 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, чтобы подавить предупреждения, которые вы, вероятно, тоже видите!)

Ответ 5

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

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent //or default
} 

Ответ 6

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

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

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

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

Ответ 7

для меня все выше dind't работать, пока я не добавлю:

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

так:

  • Установите UIViewControllerBasedStatusBarAppearance в YES в .plist
  • В viewDidLoad вызов self.setNeedsStatusBarAppearanceUpdate();
  • Переопределить preferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  • В переопределенном методе я также устанавливаю navigationBar.barStyle так окончательно
    свет:
    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
    }
}

Ответ 8

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

Что я сделал, просто

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

Нет Plist, никаких других вещей. НТН

Ответ 9

Не изменяйте свой Info.plist. Добавьте это в свой ViewController.swift:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}

Ответ 10

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    get { return .lightContent }
}

Ответ 11

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

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

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

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