Как изменить стиль строки состояния при загрузке контроллера представления?

Я могу скрыть строку состояния на экране запуска, установив Status bar is initially hidden на YES в Info.plist, а затем я хочу показать ее на моем первом контроллере представления в стиле .lightContent.

Однако UIApplication.shared.statusBarStyle = .lightContent устарел с iOS 9 (поэтому я не хочу его использовать), и использование следующего кода дает мне черную строку состояния на моем первом контроллере представления.

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Как я могу изменить стиль строки состояния при загрузке моего первого контроллера представления?

Я пытаюсь найти глобальное решение, такое как UIApplication.shared.statusBarStyle = .lightContent, поскольку я действительно не хочу устанавливать стиль строки состояния для каждого контроллера представления. Я тестировал решения с View controller-based status bar appearance, установленным на YES и NO.

stackoverflow.com/questions/38740648/…
JonJ 19.09.2018 10:20

Я уже пробовал все решения, но моя строка состояния остается черной, и я не хочу использовать устаревшее решение. Я также не уверен, что «взломанное» решение подходит для использования.

adrgrondin 19.09.2018 10:27

Ваш первый контроллер представления вложен в UINavigationController? Известно, что UINavgationController не запрашивает у своего childController свойство preferredStatusBarStyle.

Frederik 19.09.2018 10:30

@Frederik, да, я не думал об этом. Вы знаете, как я могу изменить стиль строки состояния контроллера представления, вложенного в контроллер навигации?

adrgrondin 19.09.2018 10:31

@adrgrondin Совершенно верно, но один из способов - создать подкласс UINavigationController и переопределить его свойство preferredStatusBarStyle для делегирования на topViewController. Это не самое элегантное решение, но единственное, о котором я могу думать прямо сейчас.

Frederik 19.09.2018 10:36

@Frederik, спасибо за первый способ сделать это! Я попробую и попытаюсь найти другие способы сделать это, поскольку теперь я знаю, в чем проблема.

adrgrondin 19.09.2018 10:39

@Frederik прав. Просто чтобы добавить, вам не нужно создавать подкласс UINavigationController, чтобы достичь этого; вы можете добавить расширение к UINavigationController, которое отменяет prefersStatusBarHidden и preferredStatusBarStyle. Это должно работать нормально (если вы установите View controller-based status bar appearance на YES в вашем info.plist).

Pete Morris 19.09.2018 11:05

@PeteMorris спасибо за это, все попробуют!

adrgrondin 19.09.2018 11:21

Теперь это работает, я использовал подход расширения! Вы можете ответить на вопрос или я могу ответить на него, объяснить проблему и способы ее решения.

adrgrondin 19.09.2018 11:39

@PeteMorris Хороший штрих, я не знал, что вы можете переопределить свойство экземпляра в расширении. @adrgrondin Другое решение, если вам не нужны различные контроллеры представления внутри контроллера навигации для изменения строки состояния, т.е. если вам нужен только .lightContent в вашем приложении, вы можете изменить barStyle в UINavigationBar на .black, а затем изменить barTintColor на ваш предпочтительный цвет, чтобы добиться того же. Это можно сделать в раскадровке, если вы ее используете.

Frederik 19.09.2018 15:28

@Frederik, спасибо за этот другой подход!

adrgrondin 19.09.2018 16:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
4 423
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, с которой вы столкнулись, заключается в том, что UINavigationControllerне откладывает выбор строки состояния своим контроллерам представления.

Вместо этого для контроллера навигации стиль строки состояния может быть установлен путем настройки свойства barStyle его navigationBar.

Если установлен черный стиль, строка состояния будет светлой:

navigationController?.navigationBar.barStyle = .black

Обратите внимание, что это также изменит цвет navigationBar, однако вы все равно можете установить любой цвет полосы, используя barTintColor:

navigationController?.navigationBar.barTintColor = .purple

Если вы хотите внести глобальное изменение, чтобы экземпляры всеUINavigationController использовали один и тот же стиль строки состояния (полезно, если у вас есть несколько вкладок, каждая из которых использует контроллер навигации), вы можете добавить расширение на UINavigationController и переопределить preferredStatusBarStyle свойство:

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

Последний вариант - отложить выбор до контроллеров представления в стеке контроллера навигации.

Для этого переопределите свойство childViewControllerForStatusBarStyle вашего расширения контроллера навигации и попросите его вернуть topViewController:

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

В этом случае вам нужно переопределить preferredStatusBarStyle во всех ваших контроллерах представления (не оптимальный подход, но это вариант, если вам нужен этот детальный уровень контроля для каждого дочернего контроллера).

Все эти решения требуют, чтобы ваш ключ View controller-based status bar appearance в Info.plist был установлен на YES.

Другие вопросы по теме