Как изменить стиль строки состояния - iOS 12

Мне нужно обновить стиль строки состояния на каждом контроллере представления на основе цвета фона (что делает UINavigationController автоматически).

Попробовали все варианты, описанные в stackoverflow. (View controller-based status bar appearance в info.plist установлен на YES), но никто не работал для меня.

Я использую Xcode 10 beta 6 и Swift 4.2, ориентируясь на iOS 12.

Ответы

Ответ 1

Установите View controller-based status bar appearance в состояние NO в info.plist и переопределите preferredStatusBarStyle в каждом представлении контроллера следующим образом:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

И вызовите setNeedsStatusBarAppearanceUpdate() в вашем контроллере представления (например, в viewDidLoad()).

Ответ 2

Swift 4.2, iOS 12

View controller-based status bar appearance теперь необходимо установить в YES в info.plist так как UIKit больше не хочет, чтобы мы редактировали стиль строки состояния с помощью стиля UIApplication.shared --status теперь на основе контроллера View.

Затем, если вы хотите, чтобы изменение было применено на уровне приложения, просто переопределите preferredStatusBarStyle в соответствующем контроллере представления контейнера (в идеале - в корне)...

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

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

Если стиль строки состояния когда-либо изменяется во время выполнения, вам нужно вызвать setNeedsStatusBarAppearanceUpdate() (из любого места в контроллере контейнера/корневого представления или в этом конкретном контроллере представления), в противном случае он не нужен.

Ответ 3

Если у вас есть View controller-based status bar appearance на info.plist View controller-based status bar appearance в info.plist установлен YES, и ваш контроллер просмотра встроен в UINavigationController, тогда ваш навигационный контроллер будет отвечать за обновление стиля бара (через navigationController.navigationBar.barStyle), а свойство preferredStatusBarStyle будет игнорируются

Ответ 4

У меня есть Xcode 10.2, и я обнаружил, что, установив внешний вид строки состояния View на основе контроллера в info.plist на "YES", вы не измените стиль строки состояния вообще.

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

Вот что я сделал, чтобы исправить это для себя
При наведении курсора на верхнюю строку "Список свойств информации" из файла info.plist появится небольшая круглая кнопка "+". Нажмите эту кнопку и прокручивайте элементы, пока не найдете следующие клавиши.

Просмотр внешнего вида строки состояния на основе контроллера [установите для этого значения] НЕТ
 Стиль строки состояния [установите это значение] UIStatusBarStyleLightContent

ПРИМЕЧАНИЕ. UIStatusBarStyleLightContent не найден в качестве выбираемого элемента в списке значений и должен быть введен в поле значения.

info.plist

Я надеюсь, что это поможет вам или кому-либо еще, ищущему ответ на этот вопрос.

Ответ 5

Наконец, что сработало для меня:

Добавить в Info.plist:

View controller-based status bar appearance : YES

Для каждого ViewController добавьте в viewDidLoad() и viewDidAppear():

self.setNeedsStatusBarAppearanceUpdate()

a) Для строки состояния темного цвета добавьте в ViewController:

    override var preferredStatusBarStyle: UIStatusBarStyle {
    return .default
}

б) Для строки состояния белого цвета добавьте в ViewController:

    override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Ответ 6

Если вы завернуты в навигационный контроллер, вам понадобится следующее:

final class LightNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}