Стилизовать строку состояния, когда панель навигации скрыта

#ios #swift #uikit

#iOS #swift #uikit

Вопрос:

Я знаю, что UIKit обычно вы просто переопределяете:

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  

в вашем UIViewController (или UINavigationController если он существует). Это работает отлично.


Однако при выполнении этого я сталкиваюсь с проблемой:

 navigationController?.setNavigationBarHidden(true, animated: true)
  

Теперь я не вижу панели навигации, что вполне ожидаемо и прекрасно. Однако я вижу строку состояния с темным шрифтом, что неожиданно (мой навигационный контроллер переопределяет вышеуказанное свойство, и он работает правильно, когда панель навигации не скрыта). Я хочу видеть строку состояния, но я хочу, чтобы она была светлым шрифтом. Навигационный контроллер с этого момента не прослушивается preferredStatusBarStyle , поэтому я не могу настроить его таким образом.

Есть ли какой-либо способ отобразить .lightContent стиль строки состояния, когда панель навигации скрыта ..?

Конечный эффект виден на скриншоте. Если вы увеличите масштаб, вы увидите темные буквы и батарею на темном фоне. Скриншот темной строки состояния на темном фоне

PS. Пожалуйста, не публикуйте ответы только о SwiftUI (здесь мы также поддерживаем старую iOS) и устаревшие материалы.

Ответ №1:

Найдено решение, позволяющее SDK запрашивать стиль, когда есть контроллер навигации, а панель навигации скрыта, но отображается строка состояния.

В UINavigationController подклассе вам необходимо переопределить

 override var childForStatusBarStyle: UIViewController? { return viewControllers.last }
  

А затем внутри этих контроллеров вы можете указать

 override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
  

По какой-то причине, если панель навигации скрыта, iOS SDK не запрашивает навигационный контроллер preferredStatusBarStyle . Тем не менее, он по-прежнему запрашивает childForStatusBarStyle , и у нас исправлена проблема 🙂

Ответ №2:

Попробуйте установить для вашего стиля строки состояния значение light введите описание изображения здесь

После этого установите для отображения строки состояния на основе контроллера просмотра значение НЕТ в вашем info.plist

введите описание изображения здесь

Обновить

Если вы хотите, чтобы светлое содержимое отображалось только в одном представлении, вы можете попробовать переопределить стиль пользовательского интерфейса на темный в viewDidLoad

 if #available(iOS 13.0, *) {
    self.overrideUserInterfaceStyle = .dark
}
  

Комментарии:

1. Привет, спасибо за ответ, но вы действительно прочитали мой вопрос? Я заявил там, что он отлично работает, когда панель навигации не скрыта, поэтому нет смысла делать такие радикальные вещи. Почему радикально? Потому что ваш ответ влияет на все экраны, и мне нужно применить его только к одному экрану и только в том случае, если выбран темный режим.

2. Он работает для iOS 13 , и, как я уже говорил в вопросе, я поддерживаю несколько версий iOS, поэтому он не подходит. Я вставил рабочее решение в качестве своего ответа ниже, пожалуйста, проверьте его 🙂 Хорошего дня!