앱 내에서 사용자의 설정에 따라 InterfaceStyle을 변경시켜야 하는 경우 또는 InterfaceStyle에 따라 변경해야 할 사항이 있는 경우가 있습니다. 이런 경우 overrideUserInterfaceStyle
프로퍼티를 사용하여 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는 아래와 같습니다.
위의 코드에서 traitCollection.userInterfaceStyle
을 사용하여 현재 InterfaceStyle에 따라 다른 처리를 해줄 수 있게 만들었습니다.(간단하게 라이트 모드, 다크 모드만 구현했습니다.)
그리고 overrideUserInterfaceStyle
프로퍼티를 사용하여 InterfaceStyle을 변경했습니다.
UserDefaults
를 사용한 이유는 InterfaceStyle을 변경 후 앱을 종료하고 변경한 InterfaceStyle을 유지시키기 위해서 사용했습니다.
traitCollectionDidChange
메서드를 사용하여 앱이 사용자의 환경 변화에 맞게 자연스럽게 대응할 수 있게 만들 수 있습니다.
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로 앱이 실행됩니다.