Динамическое изменение цвета панели навигации iOS (темный режим) - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь реализовать переключатель для темного режима в моем приложении - это может привести к переключению цвета навигационной панели на черный, когда UIViewController уже виден на экране.Я знаю, как это сделать, установив

UINavigationBar.appearance().barTintColor = .black
UINavigationBar.appearance().tintColor = .white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
UINavigationBar.appearance().isTranslucent = false

в AppDelegate, однако в этом случае это не сработает, поскольку это необходимо сделать динамически.

Я также пытался navigationController?.navigationBar.barTintColor = UIColor.white, но это тоже не работает.

ОБНОВЛЕНИЕ:

Я думаю, что многие ответы были перепутаны с целью этоговопрос - это никак не связано с только что выпущенным темным режимом iOS13 - это НЕЗАВИСИМАЯ функция темного режима, которую я хочу добавить в свое приложение (аналогично другим приложениям, таким как Messenger и т. д., в которых темный режим был доступен в приложении до iOS)13 был выпущен).Что мне нужно сделать, это динамически обновить цвет UINavigationBar ПОСЛЕ того, как он уже отображен на экране, так же, как я могу изменить цвет фона представления, выполнив view.backgroundColor = .white, и это обновит цвет в режиме реального временина экране.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Возможно, вы захотите проверить характеристики, предоставляемые UIViewController, чтобы определить текущий стиль интерфейса, вместо ручной проверки версий под управлением iOS 13+.Используя этот метод, вы можете определить цвета в папке «Ресурсы» для обоих видов.

Для iOS ниже 13 вы можете использовать что-то похожее на то, что было сказано @byaruah, но это не глобальный эффект.Вам также следует рассмотреть возможность использования функциональности UINavigationBar.appearance() для глобального подхода.

0 голосов
/ 21 сентября 2019

Достигается это, делая полупрозрачную панель навигации (в AppDelegate):

let barAppearance = UINavigationBar.appearance()
barAppearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: appRed]
barAppearance.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
barAppearance.shadowImage = UIImage()
barAppearance.isTranslucent = true

Затем я создаю представление и размещаю его позади панели навигации следующим образом (с помощью SnapKit):

let coverView = UIView() 
cover.snp.makeConstraints {
        make in
        make.left.right.top.equalTo(self)
        make.bottom.equalTo(self.snp.top).offset(universalNumber(num: parent!.topbarHeight))
}

, где parent - это мои UIViewController, а topBarHeight - это:

extension UIViewController {
/**
 *  Height of status bar + navigation bar (if navigation bar exist)
 */
    var topbarHeight: CGFloat {
        return UIApplication.shared.statusBarFrame.size.height +
            (self.navigationController?.navigationBar.frame.height ?? 0.0)
    }
}

Наконец, чтобы обновить цвет, я установил

coverView.backgroundColor = universalWhite() 

, где

func universalWhite() -> UIColor {
   let defaults = UserDefaults.standard
   let darkMode = defaults.bool(forKey: "darkMode")
   if darkMode {
       return .black
   } else {
       return .white
    }
 }
0 голосов
/ 20 сентября 2019

Вы можете использовать backgroundColor & barTintColor панели навигации, вот пример, реализованный с использованием UISwitch

 @IBAction func toggleDarkMode(_ sender: UISwitch) {
    if sender.isOn{
        let navigationBarAppearance = self.navigationController?.navigationBar
        navigationBarAppearance?.backgroundColor = .black
        navigationBarAppearance?.barTintColor = .black
    }
    if !sender.isOn {
    let navigationBarAppearance = self.navigationController?.navigationBar
        navigationBarAppearance?.backgroundColor = .blue
        navigationBarAppearance?.barTintColor = .blue
    }
}
...