[swift] RxSwift에서의 다크 모드 지원 방법

RxSwift를 사용하여 iOS 앱을 개발하고 있다면, 다크 모드를 지원하는 것이 중요한 요소가 될 수 있습니다. 다크 모드는 사용자가 시스템 전체적으로 어두운 테마를 사용할 수 있는 기능입니다. 이 기능을 활용하면 앱의 사용자 인터페이스를 더욱 편안하게 만들 수 있습니다.

RxSwift를 통해 다크 모드를 지원하는 방법을 살펴보겠습니다.

1. 시스템 다크 모드 감지

우선, 시스템 다크 모드를 감지하여 현재 앱이 어두운 모드인지 밝은 모드인지 확인해야 합니다. RxSwift에서는 Trait을 사용하여 시스템의 다크 모드 변화를 감지할 수 있습니다.

다음은 이를 구현한 예시 코드입니다.

extension UITraitCollection {
    var isDarkMode: Bool {
        if #available(iOS 13.0, *) {
            return userInterfaceStyle == .dark
        }
        return false
    }
}

let darkModeStream = NotificationCenter.default.rx
    .notification(UIWindow.didBecomeVisibleNotification)
    .map { _ in UITraitCollection.current.isDarkMode }
    .distinctUntilChanged()

위 코드에서는 UITraitCollection을 확장하여 isDarkMode라는 속성을 추가했습니다. 이 속성은 iOS 13 이상에서만 사용할 수 있습니다.

그리고 darkModeStreamUIWindow.didBecomeVisibleNotification을 감지하여 현재 다크 모드인지를 알려주는 옵저버블 입니다. 이 옵저버블의 값이 다크 모드 변화에 따라 변경되는데, distinctUntilChanged() 연산자를 사용하여 값의 중복을 제거합니다.

2. 다크 모드에 따른 테마 변경

다크 모드가 변경되면 앱의 테마를 조정하여 사용자에게 적합한 대응을 해야합니다. RxSwift를 사용하여 다크 모드에 따른 테마 변경을 간단하게 구현할 수 있습니다.

다음은 테마 변경을 위한 예시 코드입니다.

let themeStream = darkModeStream
    .map { isDarkMode in isDarkMode ? .dark : .light }

themeStream
    .subscribe(onNext: { theme in
        // 테마 변경 로직
    })
    .disposed(by: disposeBag)

위 코드에서는 themeStream이라는 옵저버블을 생성합니다. darkModeStream을 구독하여 다크 모드가 변경되었을 때, 테마를 .dark 또는 .light로 변경하도록 매핑합니다.

그리고 themeStream을 구독하여 테마 변경 로직을 수행합니다. 이 예시 코드에서는 onNext 클로저에서 테마 변경에 대한 로직을 작성하면 됩니다.

3. 다크 모드와 관련된 UI 업데이트

마지막으로, 다크 모드가 변경될 때 앱의 UI를 업데이트해야 할 수도 있습니다. 예를 들어, 텍스트 색상, 배경색 등을 다크 모드에 맞게 변경해야 할 수 있습니다.

다음은 다크 모드와 관련된 UI 업데이트를 위한 예시 코드입니다.

let label = UILabel()

themeStream
    .observeOn(MainScheduler.instance)
    .subscribe(onNext: { theme in
        switch theme {
        case .dark:
            label.textColor = .white
            label.backgroundColor = .black
        case .light:
            label.textColor = .black
            label.backgroundColor = .white
        }
    })
    .disposed(by: disposeBag)

위 코드에서는 themeStream을 구독하여 테마에 따라 label의 텍스트 색상과 배경색을 변경하는 로직을 작성했습니다. 다크 모드가 .dark로 변경되면 텍스트 색상을 흰색으로, 배경색을 검은색으로 변경하고, .light일 경우에는 텍스트 색상을 검은색으로, 배경색을 흰색으로 변경하도록 구현되어 있습니다.

이와 같은 방법으로 다크 모드를 지원할 수 있습니다.


위에 소개한 방법은 RxSwift를 사용하여 다크 모드를 지원하는 방법 중 일부입니다. RxSwift를 사용하면 앱 개발 과정에서 더욱 효율적으로 다크 모드를 구현할 수 있습니다.

다른 방법으로는 traitCollectionDidChange() 메서드를 사용하여 다크 모드 변화를 감지하거나, Appearance를 사용하여 테마에 따른 UI 업데이트를 할 수도 있습니다.

더 자세한 내용은 RxSwift 공식 문서를 참고하시기 바랍니다.