[iOS] 다크 모드 적용하기

Han's·2023년 7월 29일
0
post-thumbnail

앱 내에서 사용자의 설정에 따라 InterfaceStyle을 변경시켜야 하는 경우 또는 InterfaceStyle에 따라 변경해야 할 사항이 있는 경우가 있습니다. 이런 경우 overrideUserInterfaceStyle 프로퍼티를 사용하여 InterfaceStyle을 변경할 수 있습니다.

InterfaceStyle 변경하기

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func screenModeChange(_ sender: UIButton) {
        if self.traitCollection.userInterfaceStyle == .light{
            self.view.window?.overrideUserInterfaceStyle = .dark
            UserDefaults.standard.set(2, forKey: "Appearance")
        } else {
            self.view.window?.overrideUserInterfaceStyle = .light
            UserDefaults.standard.set(1, forKey: "Appearance")
        }
    }
    
    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        
        if self.traitCollection.userInterfaceStyle == .light {
            // 라이트 모드
            DispatchQueue.main.async {
                // UI 변경
            }
        } else if self.traitCollection.userInterfaceStyle == .dark {
            // 다크 모드
            DispatchQueue.main.async {
                // UI 변경
            }
        } else { // .unspecified
            DispatchQueue.main.async {
                // UI 변경
            }
        }
    }
}

InterfaceStyle은 총 3가지로 각각의 rawValue는 아래와 같습니다.

  • unspecified / rawValue = 0
  • light (라이트 모드) / rawValue = 1
  • dark (다크 모드) / rawValue = 2

위의 코드에서 traitCollection.userInterfaceStyle을 사용하여 현재 InterfaceStyle에 따라 다른 처리를 해줄 수 있게 만들었습니다.(간단하게 라이트 모드, 다크 모드만 구현했습니다.)

그리고 overrideUserInterfaceStyle 프로퍼티를 사용하여 InterfaceStyle을 변경했습니다.

UserDefaults를 사용한 이유는 InterfaceStyle을 변경 후 앱을 종료하고 변경한 InterfaceStyle을 유지시키기 위해서 사용했습니다.

traitCollectionDidChange 메서드를 사용하여 앱이 사용자의 환경 변화에 맞게 자연스럽게 대응할 수 있게 만들 수 있습니다.

앱 종료 후 InterfaceStyle 유지하기

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    	guard let _ = (scene as? UIWindowScene) else { return }
    
        let rawValue = UserDefaults.standard.integer(forKey: "Appearance")
        window?.overrideUserInterfaceStyle = UIUserInterfaceStyle(rawValue: rawValue) ?? .unspecified
    }
}

InterfaceStyle을 변경 후 UserDefaults를 사용한 이유가 해당 코드에 있습니다.
위의 코드를 적용시키면 앱을 종료 시킨 후 다시 실행시켜도 마지막으로 선택한 InterfaceStyle로 앱이 실행됩니다.

profile
🍎 iOS Developer

0개의 댓글