#ios #swift #uinavigationcontroller #uinavigationbar #statusbar
#iOS #swift #uinavigationcontroller #панель uinavigationbar #строка состояния
Вопрос:
Я пытаюсь изменить текст строки состояния на белый на некоторых контроллерах просмотра, но на некоторых других он все еще должен быть черным. (поэтому невозможно изменить его глобально для всего приложения).
Все работает нормально, за исключением первых нескольких секунд, когда при нажатии на разные панели вкладок возникает сбой, и половина текста в строке состояния становится черной, а не белой. Затем все обновляется идеально.
Структура такая: контроллер панели вкладок с несколькими вкладками, каждая вкладка содержит навигационный контроллер, содержащий контроллер просмотра.
Наличие навигационных контроллеров потребовало изменения navigationController?.navigationBar.barStyle = .black
, чтобы заставить его работать.
После нескольких нажатий на вкладки все работает нормально.
Первое, что я сделал, конечно, было установить на YES
View controller-based status bar appearance
из .plist
Я также переопределил preferredStatusBarStyle, используя логическое значение, чтобы установить, какие контроллеры просмотра должны иметь белый или черный текст строки состояния:
override var preferredStatusBarStyle: UIStatusBarStyle {
return coloredNavigationBar ? .lightContent : .default
}
var coloredNavigationBar: Bool = true
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if coloredNavigationBar {
navigationController?.navigationBar.barStyle = .black
} else {
navigationController?.navigationBar.barStyle = .default
}
setNeedsStatusBarAppearanceUpdate()
}
Вставленный код взят из базового контроллера представления, используемого повсюду.
Комментарии:
1. Круто! Но как нам это воспроизвести? Что означает «при нажатии на разные панели вкладок»? На вашем снимке экрана или в вашем коде нет «полос вкладок».
2. Структура такая: контроллер панели вкладок с несколькими вкладками, каждая вкладка содержит навигационный контроллер, содержащий контроллер просмотра. Наличие контроллеров навигации привело к необходимости изменить .barStyle, чтобы заставить его работать. После нескольких нажатий на вкладки все работает нормально. Вставленный код взят из базового контроллера представления, используемого повсюду.
3. Итак, проблема в том, что в навигационном контроллере ваш
preferredStatusBarStyle
не вызывается. Навигационный контроллер получает стиль строки состояния из стиля панели навигации. Кроме того, у вас есть контроллер панели вкладок в качестве контроллера представления верхнего уровня, так что он определяет стиль строки состояния. Вероятно, вам следует предоставить контроллеру панели вкладок делегат, чтобы он мог устанавливать стиль строки состояния по мере необходимости.
Ответ №1:
Да! @мэтт был прав, спасибо. Действительно, iOS запутывается при использовании панели вкладок.
Решение состояло в том, чтобы добавить это в TabBarController:
override public var childForStatusBarStyle: UIViewController? {
if let controller = selectedViewController as? UINavigationController {
return controller.visibleViewController
}
return selectedViewController
}
Комментарии:
1. У меня отлично работал с текущим XCode 12.5.1 и IOS 14.7.1