web-dev-qa-db-ja.com

iOSナビゲーションバーの色を動的に変更する(ダークモード)

アプリにダークモードのトグルを実装しようとしています。これには、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ダークモードとはまったく関係ありません-これはアプリに追加したい独立したダークモード機能です(他のものと同様)ダークモードを備えたメッセンジャーなどのアプリは、iOS 13がリリースされる前にアプリ内で利用できました)。私がしなければならないことは、UINavigationBarが画面に既に表示された後で色を動的に更新することです。これは、view.backgroundColor = .whiteこれにより、画面上でリアルタイムに色が更新されます。

3
Alk

ナビゲーションバーを半透明にすることでこれを実現しました(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
Alk

IOS 13以降を実行しているバージョンを手動でチェックする代わりに、UIViewControllerで提供される特性をチェックして、現在のインターフェイススタイルを確認することをお勧めします。この方法を使用すると、Assetsフォルダで両方の外観の色を定義できます。

以下のiOS 13では、@ byaruahが述べたものと同様のものを使用できますが、これはグローバルな効果ではありません。また、グローバルなアプローチのためにUINavigationBar.appearance()機能の使用を検討する必要があります。

0
Jstngoulet