Я могу скрыть строку состояния на экране запуска, установив 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.
Я уже пробовал все решения, но моя строка состояния остается черной, и я не хочу использовать устаревшее решение. Я также не уверен, что «взломанное» решение подходит для использования.
Ваш первый контроллер представления вложен в UINavigationController? Известно, что UINavgationController не запрашивает у своего childController свойство preferredStatusBarStyle.
@Frederik, да, я не думал об этом. Вы знаете, как я могу изменить стиль строки состояния контроллера представления, вложенного в контроллер навигации?
@adrgrondin Совершенно верно, но один из способов - создать подкласс UINavigationController и переопределить его свойство preferredStatusBarStyle для делегирования на topViewController. Это не самое элегантное решение, но единственное, о котором я могу думать прямо сейчас.
@Frederik, спасибо за первый способ сделать это! Я попробую и попытаюсь найти другие способы сделать это, поскольку теперь я знаю, в чем проблема.
@Frederik прав. Просто чтобы добавить, вам не нужно создавать подкласс UINavigationController, чтобы достичь этого; вы можете добавить расширение к UINavigationController, которое отменяет prefersStatusBarHidden и preferredStatusBarStyle. Это должно работать нормально (если вы установите View controller-based status bar appearance на YES в вашем info.plist).
@PeteMorris спасибо за это, все попробуют!
Теперь это работает, я использовал подход расширения! Вы можете ответить на вопрос или я могу ответить на него, объяснить проблему и способы ее решения.
@PeteMorris Хороший штрих, я не знал, что вы можете переопределить свойство экземпляра в расширении. @adrgrondin Другое решение, если вам не нужны различные контроллеры представления внутри контроллера навигации для изменения строки состояния, т.е. если вам нужен только .lightContent в вашем приложении, вы можете изменить barStyle в UINavigationBar на .black, а затем изменить barTintColor на ваш предпочтительный цвет, чтобы добиться того же. Это можно сделать в раскадровке, если вы ее используете.
@Frederik, спасибо за этот другой подход!





Проблема, с которой вы столкнулись, заключается в том, что 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.