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

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

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

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


person Tomáš Pánik    schedule 08.09.2018    source источник
comment
Возможный дубликат настройки statusbarStyle (не рекомендуется в iOS 9.0)   -  person Jacob Ahlberg    schedule 01.11.2018


Ответы (6)


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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

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

person ielyamani    schedule 08.09.2018
comment
Ты прав! Но это устарело с iOS 9. Но я что-то пропустил? Я установил значение info.plist. Затем добавил эту строку в viewDidLoad () конкретного контроллера представления. Никаких видимых изменений. - person Tomáš Pánik; 08.09.2018
comment
@ TomášPánik ты звонишь self.setNeedsStatusBarAppearanceUpdate()? - person ielyamani; 08.09.2018
comment
Конечно. xcode сообщает мне, что установщик для 'statusBarStyle' устарел в iOS 9.0: используйте -[UIViewController prefferedStatusBarStyle]. ты знаешь, как это сделать? обратите внимание, что я получаю другое свойство ошибки, которое по какой-то причине не отменяет какое-либо свойство из его суперкласса, при использовании override var prefferedStatusBarStyle ... - person Tomáš Pánik; 08.09.2018
comment
метод ошибки не переопределяет какой-либо метод из своего суперкласса - person Tomáš Pánik; 09.09.2018
comment
@ TomášPánik вы используете его в UIViewController? - person ielyamani; 09.09.2018
comment
офс. class blabla: UIViewController - person Tomáš Pánik; 09.09.2018
comment
Я могу перетащить этот проект на свой github, если вам, как и мне, интересно, что с ним не так: D - person Tomáš Pánik; 09.09.2018
comment
вообще не работает с переопределением. Тяну на гитхаб, дай 2 минуты - person Tomáš Pánik; 09.09.2018
comment
edit: теперь работает над обоими проектами; Мне пришлось что-то пропустить, думаю, я тоже пробовал это -.- - person Tomáš Pánik; 09.09.2018
comment
Примечание: этот метод работает с логическим значением plist, установленным в YES - person Tomáš Pánik; 09.09.2018
comment
вы можете искать другие ответы по этому поводу :) большое спасибо, я не знаю, что было не так, когда я пробовал все ответы из stackoverflow, но теперь он работает :) - person Tomáš Pánik; 09.09.2018
comment
Рад, что смог помочь! - person ielyamani; 09.09.2018
comment
Если вы используете модально представленный контроллер представления, вам может потребоваться установить myViewController.modalPresentationCapturesStatusBarAppearance = true на контроллере представления, чтобы оно отображалось модально. Я не смог бы заставить этот ответ работать, если бы не сделал этого. Ключ info.plist был установлен на yes. - person Chris; 09.11.2018

Swift 4+, iOS 12+

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

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

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

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

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

person liquid    schedule 21.09.2018
comment
Этот! Все остальные ответы, касающиеся установки View controller-based status bar appearance на NO НЕ РАБОТАЕТ. - person Caio; 07.11.2018
comment
Я использую настраиваемые переходы между контроллерами представления. Поскольку в iOS 12 анимация строки состояния не работает, я использовал плавный переход от светлого к стандартному и наоборот. В iOS 12 строка состояния кратковременно мигает перед переходом. Вы знаете, что изменилось? - person Evgeny; 09.11.2018
comment
И, если rootViewController UIApplication является tabbarvc или navigationvc (контроллер представления контейнера), тогда этот vc возьмет на себя управление, вы можете переопределить метод childViewControllerForStatusBarStyle и вернуть контроллер, который вы хотите взять на себя управление. Например, панель вкладок возвращает selectedViewController (navigationvc), а navigationvc возвращает свой topViewController. - person Jiangshi Fresh; 13.08.2020

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

person swearwolf    schedule 22.10.2018

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

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

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

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

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

 info.plist

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

person Jim Bray    schedule 12.04.2019
comment
Но изменит ли UIStatusBarStyleLightContent цвет строки состояния на каждом ViewController в зависимости от содержимого? - person Tomáš Pánik; 12.04.2019
comment
Ого, я не увидел эту часть в вопросе LOL, похоже, мне нужно уделять больше внимания вопросам здесь. Нет, они не меняются в зависимости от содержания. Это просто изменит их для всего проекта. Спасибо что подметил это!. - person Jim Bray; 12.04.2019

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

final class LightNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}
person thexande    schedule 14.09.2019

override func viewDidLoad(){
    super.viewDidLoad()

    navigationController?.navigationBar.barStyle = .default
}

override var prefersStatusBarHidden: Bool {
    return true
}

Я применил режим прокрутки также на том же экране, с помощью этого кода удалось решить проблему со строкой состояния.

person Deviyani Swami    schedule 15.06.2020
comment
Этот код ничего не делает для изменения стиля строки состояния! - person Keyhan Kamangar; 27.09.2020