Настройка statusbarStyle (устаревший в iOS 9.0)
Просто скачал новый xCode 10.0 и увидел, что старый статусBarStyle устарел с iOS 9.0.
Предупреждение: Setter for 'statusBarStyle' was deprecated in iOS 9.0: Use -[UIViewController preferredStatusBarStyle]
Устаревший код: UIApplication.shared.statusBarStyle =.default
Я попытался использовать self.preferredStatusBarStyle
, но выяснил, что свойство является только получателем. Так кто знает, как установить statusBarStyle
?
редактировать
Я хочу изменить statusBarStyle внутри функции, где пользователь может переключаться между разными темами. Например:
func changeStatusBar(toDarkMode: Bool) {
if toDarkMode {
// Set to light statusBarStyle
} else {
// Set to default
}
}
Ответы
Ответ 1
Задайте переменную darkMode с помощью того же кода, который у вас есть, а затем используйте его в вычисленной переменной, ожидаемой системой:
var darkMode = false
override var preferredStatusBarStyle : UIStatusBarStyle {
return darkMode ? .default : .lightContent
}
В зависимости от контекста вам может потребоваться принудительное обновление экрана, чтобы он вступил в силу. Вы сделали бы это со следующим вызовом:
setNeedsStatusBarAppearanceUpdate()
Ответ 2
Добавить View controller-based status bar appearance NO
в Info.plist
И выберите Light в стиле строки состояния в Deployment Info
Ответ 3
В swift4 вы можете использовать этот блок кода ниже viewDidLoad()
в вашем ViewController
-
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
Ответ 4
Если вы используете UINavigationController, вы также можете использовать следующий код:
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return topViewController?.preferredStatusBarStyle ?? .default
}
}
Причина установлена setNeedsStatusBarAppearanceUpdate()
не вызывает setNeedsStatusBarAppearanceUpdate()
preferredStatusBarStyle
Ответ 5
Ни одно из других предложений не сработало для меня. Я закончил тем, что заставил это работать:
-
Окружение:
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
-
Вызов:
setNeedsStatusBarAppearanceUpdate()
Ответ 6
Мое решение было так: сделать расширение из контроллера навигации:
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
if let topViewController = presentedViewController{
return topViewController.preferredStatusBarStyle
}
if let topViewController = viewControllers.last {
return topViewController.preferredStatusBarStyle
}
return .default
}
}
и если у вас есть viewController, который будет иметь другой стиль, чем стиль приложения, вы можете сделать это
var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
return barStyle
}
.default
что стиль состояния вашего приложения - .default
и вы хотите, чтобы этот экран был .lightContent
поэтому barStyle примет значение .lightContent
качестве значения по умолчанию, это изменит стиль строки состояния на lightContent, а затем убедитесь, что когда viewWillDisappear
изменит barStyle снова в стиле строки состояния приложения, который в нашем случае является .default
.
это работает для меня