Certaines configurations de l'interface utilisateur ne fonctionnant pas automatiquement avec le mode Dark/Light changent en tant que UIColor
. Par exemple shadow
dans la couche. Comme je dois supprimer et déposer des ombres en mode sombre et clair, j'ai besoin d'un endroit pour mettre la fonction updateShadowIfNeeded()
. Je sais détecter quel est le mode actuellement:
func dropShadowIfNeeded() {
switch traitCollection.userInterfaceStyle {
case .dark: removeShadow()
case .light: dropShadowIfNotDroppedYet()
default: assertionFailure("Unknown userInterfaceStyle")
}
}
Maintenant, je mets la fonction dans le layoutSubviews
, car elle est appelée à chaque changement d'apparence:
override func layoutSubviews() {
super.layoutSubviews()
dropShadowIfNeeded()
}
Mais cette fonction est appelée BEAUCOUP. Quelle est la fonction appropriée à déclencher uniquement si userInterfaceStyle
a changé?
Avec RxSwift et ObjectiveC runtime, vous pouvez y parvenir sans héritage
voici la version encapsulée:
import UIKit
import RxSwift
import RxCocoa
enum SystemTheme {
static func get(on view: UIView) -> UIUserInterfaceStyle {
view.traitCollection.userInterfaceStyle
}
static func observe(on view: UIView) -> Observable<UIUserInterfaceStyle> {
view.rx.methodInvoked(#selector(UIView.traitCollectionDidChange(_:)))
.map { _ in SystemTheme.get(on: view) }
.distinctUntilChanged()
}
}