アプリにダークモードのトグルを実装しようとしています。これには、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
これにより、画面上でリアルタイムに色が更新されます。
ナビゲーションバーを半透明にすることでこれを実現しました(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
}
}
IOS 13以降を実行しているバージョンを手動でチェックする代わりに、UIViewControllerで提供される特性をチェックして、現在のインターフェイススタイルを確認することをお勧めします。この方法を使用すると、Assetsフォルダで両方の外観の色を定義できます。
以下のiOS 13では、@ byaruahが述べたものと同様のものを使用できますが、これはグローバルな効果ではありません。また、グローバルなアプローチのためにUINavigationBar.appearance()
機能の使用を検討する必要があります。