UIStatusBarStyle не працює в Swift


85

Я намагаюся змінити колір рядка стану в моєму додатку 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
}

Чого мені не вистачає?

Відповіді:


145

У вас є два варіанти.

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

Перегляд зовнішнього вигляду рядка стану на основі контролера

Або, якщо ви хочете продовжувати використовувати вигляд рядка стану на основі контролера перегляду, замість того, щоб встановлювати статус statusBarStyle програми, перевизначте preferredStatusBarStyleвластивість кожного контролера перегляду, для якого ви хочете вказати стиль рядка стану.

Стрімкий 3

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Стрімкий 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

Свіфт 3.0

у AppDelegate.swift didFinishLaunchingWithOptions

UIApplication.shared.statusBarStyle = .lightContent

Info.plist

View controller-based status bar appearance -> NO

Свіфт 2.2

у AppDelegate.swift didFinishLaunchingWithOptions

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

З цим чудово працює 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, щоб придушити попередження, які ви, мабуть, теж бачите!)


Дякую. Здається, в iOS9 є серйозна помилка. Тільки так я міг перетворити рядок стану у початковий білий ВК. Я все пробував. Я подам радар.
1b0t

preferStatusBarStyle, що повертає UIStatusBarStyleDefault, але не оновлює lightcontent до darkcontent для конкретного контролера перегляду. Після self.navigationController.navigationBar.barStyle = UIBarStyleDefault; з оглядуWillAppear спрацював на мене. Сподіваюся, цей коментар допоможе іншим.
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.pl. Це також зробить рядок стану екрану запуску білим. Хоча код вище не буде.

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

Підхід до .plist правильний, але setStatusBarStyle () не є необхідним. 'setStatusBarStyle (_: animated :)' застаріло в iOS 9.0: Використовуйте - [UIViewController preferStatusBarStyle]
Білл Чан

@BillChan дякую за коментар, але, будь ласка, прочитайте відповідь. Я вже пояснював, що 'setStatusBarStyle' застарілий. Вам слід використовувати preferStatusBarStyle, якщо ви хочете змінити той чи інший viewControllers. Підхід до plist призначений для тих, хто хоче змінити всі viewControllers за один постріл. Тут немає ні правильного, ні неправильного. Лише питання того, чого вам потрібно досягти.
GuiSoySauce

1
UIStatusBarStyle = UIStatusBarStyleLightContent (у .plist) допоміг моєму додатку запуститись білим текстом рядка стану ... Дякую !!!
Chris Allinson

10

для мене все вище не працює, поки я не додаю:

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

тому:

  1. Набір UIViewControllerBasedStatusBarAppearanceдля YESв.plist
  2. У viewDidLoadдзвінкуself.setNeedsStatusBarAppearanceUpdate();
  3. Замінити бажанийStatusBarStyle
    override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  4. У перевизначеному методі я також встановив 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
    }
}

1
Без коментарів щодо стилю панелі навігації ... але в Swift 3, Xcode 8 - це було єдиним рішенням, яке працювало для мене.
Деспотович

Єдиним недоліком, який я помітив, є те, що з усіма цими кроками він змінюється, але без анімації
Лукаш Северян Грела

6

Дивно, використовуючи Swift 3.1 та XC8.2.1, але все вищесказане не спрацювало.

Те, що я зробив, просто

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

Ніякого Пліста, ніяких інших речей. HTH


Працює і для 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()

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.