次のドキュメントを読みます: https://developer.Apple.com/documentation/appkit/supporting_dark_mode_in_your_interface
ユーザーがシステムの外観を変更すると、システムは自動的に各ウィンドウとビューに再描画を要求します。このプロセスの間に、システムはmacOSとiOSの両方のよく知られたいくつかのメソッドを呼び出し、次の表にリストされているように、コンテンツを更新します。
従来のアプリでは、各クラスのinitでビューを遅延変数として作成します。つまり、ユーザーが設定に入ってダークモードに切り替えると、ビューは正しい色で描画されません。
これらのメソッドの外で外観に影響のある変更を加えると、アプリは現在の環境でコンテンツを正しく描画しない可能性があります。解決策は、コードをこれらのメソッドに移動することです。
私たちのアプリケーションは非常に大きく、将来的にはこれをより適切にサポートするためにリファクタリングが行われますが、Mac OSで実行できるような通知センターでこの変更を検出する方法があるかどうか疑問に思っています。
Swift 3 を使用してmacOSのデフォルトとダークモードの切り替えを検出する方法
Objective-Cバージョン:
if (@available(iOS 12.0, *)) {
if( self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ){
//is dark
}else{
//is light
}
}
色の設定をすべてのビューのlayoutSubviews()関数とビューコントローラーのviewDidLayoutSubviews()に移動しました。
暗いライトモードの変更を検出するためにiOS 13からメソッドをオーバーライドするだけSwift 5
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if #available(iOS 13.0, *) {
if self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
if traitCollection.userInterfaceStyle == .dark {
//Dark
}
else {
//Light
}
}
} else {
// Fallback on earlier versions
}
}