私のアプリでは、iOS システムのダーク モード設定が変更されたときに、カスタム UI を変更する必要があります。https://developer.apple.com/videos/play/wwdc2019/214/によるとtraitCollectionDidChange
、 を使用して以前と現在の特性コレクションを実装して比較することが明示的に言及されていhasDifferentColorAppearance(comparedTo:)
ます。
ドキュメントには次のように記載されています。
このメソッドを使用して、現在の環境の特性を変更するとインターフェイスの色も変更されるかどうかを判断します。たとえば、userInterfaceStyle または accessibilityContrast プロパティを変更すると、通常、インターフェイスの色が変更されます。
実装したView Controllerのサブクラスで
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if #available(iOS 13.0, *),
self.traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
let isSameUserInterfaceStyle = (self.traitCollection.userInterfaceStyle == previousTraitCollection?.userInterfaceStyle)
let isSameAcessibilityContrast = (self.traitCollection.accessibilityContrast == previousTraitCollection?.accessibilityContrast)
// do custom stuff
}
}
しかし、場合によっては、 ifも を返すとは予想していなかった とisSameUserInterfaceStyle
の両方がisSameAcessibilityContrast
評価されます。私は Apple が提案する API の使用法を回避するのは好きではありませんが、UIが実際に変更されていない場合は不要な変更を加えたくありません。したがって、結果に頼るべきか、それとも両方の特性コレクションを比較するだけで十分かはわかりません。true
hasDifferentColorAppearance(comparedTo:)
true
userInterfaceStyle
hasDifferentColorAppearance(comparedTo:)
userInterfaceStyle