Настройка 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

enter image description here

Ответ 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

Ни одно из других предложений не сработало для меня. Я закончил тем, что заставил это работать:

  1. Окружение:

    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
    
  2. Вызов:

    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.

это работает для меня