Как изменить стиль строки состояния - 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 не найден в качестве выбираемого элемента в списке значений и должен быть введен в поле значения.
Я надеюсь, что это поможет вам или кому-либо еще, ищущему ответ на этот вопрос.
Ответ 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
}
}