Проблема, с которой вы столкнулись, заключается в том, что UINavigationController
не откладывает выбор строки состояния для своих контроллеров представления.
Вместо этого для контроллера навигации - строка состояниястиль может быть установлен путем настройки свойства barStyle
его navigationBar
.
Если для него задан черный стиль, строка состояния будет иметь стиль light:
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
.