Как изменить цвет текста в строке состояния сразу в Swift в iOS 13 - PullRequest
0 голосов
/ 28 октября 2019

Я использую Swift 5.1 и Xcode 11.1, и в настоящее время я завершил реализацию дизайна Dark Mode.

Тема обновляется сразу после того, как пользователь меняет стиль темы на странице настроек с этим кодом.

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
   return
}
appDelegate.changeTheme(themeVal)

// App Delegate File
...
func changeTheme(themeVal: String) {
   if #available(iOS 13.0, *) {
       switch AppState.appThemeStyle {
       case "dark":
           window?.overrideUserInterfaceStyle = .dark
           break
       case "light":
           window?.overrideUserInterfaceStyle = .light
           break
       default:
           window?.overrideUserInterfaceStyle = .unspecified
       }
   }
}

Но проблема в том, что я не вижу текст строки состояния, потому что цвет текста строки состояния и цвет представления одинаковы.

Может кто-нибудь предложить мне хорошее решение? Спасибо.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Вы должны изменить цвет фона строки состояния, как показано ниже

func setStatusBarBackgroundColor(color: UIColor) {
    let tag = 13254
    if let statusBar = UIApplication.shared.keyWindow?.viewWithTag(tag) {
        statusBar.backgroundColor = color
    } else {
        let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
        statusBarView.tag = tag
        UIApplication.shared.keyWindow?.addSubview(statusBarView)
        statusBarView.backgroundColor = color
    }
}
1 голос
/ 28 октября 2019

Цвет строки состояния не является глобальным (по умолчанию), и если вы установите значение не ViewControllerBased, вы больше не сможете его изменить. Таким образом, вам нужно изменить его в любом представлении, которое вам нужно, например:

var statusBarStyle = UIStatusBarStyle.default { didSet { setNeedsStatusBarAppearanceUpdate() } }
override var preferredStatusBarStyle: UIStatusBarStyle { statusBarStyle }

. Эти две переменные помогут вам изменить строку состояния. Обратите внимание, что вы можете вызвать setNeedsStatusBarAppearanceUpdate внутри блока анимации, чтобы сделать его анимируемым.

, чтобы определить, когда UserInterfaceStyle изменяется (и соответственно обновлять цвет statusBar), все виды и viewControllers имеют функцию делегата для этого. Итак, зная, что:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
        updateStatusBarColor()
    }
}

И это функция :

func updateStatusBarColor() {
    switch traitCollection.userInterfaceStyle {
    case .unspecified: statusBarStyle = .default
    case .light: statusBarStyle = .darkContent
    case .dark: statusBarStyle = .lightContent
    }
}

Обратите внимание, что:

ParentViewController определяет statusBarColor,Поэтому, если вы используете общие navigationController или tabBarController, для них должно быть достаточно пользовательского класса с этими кодами.

...