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

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

application.statusBarStyle = .LightContent

и

UIApplication.sharedApplication().statusBarStyle = .LightContent

все, что есть в документах сказать о нем, что UIBarButtonStyle является int и дал мне этот фрагмент перечислений, который не помог мне с реализация.

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

что я упустил?

11 ответов


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

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

вид контроллера на основе строки состояния внешний вид

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

Swift 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Swift 2

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

Swift 3.0

в AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

информация.файл plist

View controller-based status bar appearance -> NO

Swift 2.2

в AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.sharedApplication().statusBarStyle = .LightContent

информация.файл plist

View controller-based status bar appearance -> NO

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

navigationController.navigationBar.barStyle = .black

и текст будет отображаться в белый


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


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

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

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

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

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

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

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

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

так:

  1. Set UIViewControllerBasedStatusBarAppearance to YES на .plist
  2. на viewDidLoad вызов self.setNeedsStatusBarAppearanceUpdate();
  3. переопределить preferredStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. в способ перекрытая я тоже navigationBar.barStyle so 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
    }
}

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

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

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

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


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

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

не редактируйте информацию.файл plist. Добавьте это в свой ViewController.Свифт:

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

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

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

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

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