web-dev-qa-db-fra.com

Comment détecter le changement de mode Light \ Dark dans iOS 13?

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é?

3
Mojtaba Hosseini

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()
    }
}
0
duan