본문 바로가기

iOS

Dynamic Color - 다크모드

천천히 알아보기 위해 편하게 작성하겠습니다.

 

WWDC19 - 

 

Implementing Dark Mode on iOS - WWDC19 - Videos - Apple Developer

Hear from the UIKit engineering team about the principles and concepts that anchor Dark Mode on iOS. Get introduced to the principles of...

developer.apple.com

 

 

앱의 모든 View 및 ViewController에는 traitCollection이 있으며 이를 통해 뷰의 모양을 결정하는데 도움을 준다.

Dynamic Color를 사용하면 자동으로 light 혹은 dark mode의 색상이 정해진다.

자동으로 정해지는 방법은 UITraitCollection 타입에 의해 이뤄진다.

해당 타입에는 다양한 정보가 있는데 Dynamic Color와 연관된 값으로는 userInterfaceStyle 이 있다. 

userInterfaceStyle == .dark 라면 Dynamic Color의 색상은 dark mode의 색상으로 결정된다.

Dynamic Color는 어떻게 traitCollection.userInterfaceStyle 값을 알 수 있을까?

UIKit에는 UITraitCollection.current라는 속성이 있으며 UIKit에 의해 설정된다. 그리고 Dynamic Color는 current를 통해 스타일을 결정한다. 

 

UITraitCollection.current는 어떻게 traitCollection을 구성할까?

WWDC19의 예시 메소드
current 공식문서에 나열된 UIKit이 해당 메서드가 호출되기 전 current를 설정한다는 메서드 목록

current는 특정 메서드가 호출되기 전에 UIKit이 view.traitCollection으로 설정한다.

만약 커스텀한 View의 layoutSubviews() 메소드가 호출된다면 호출되기 전, UIKit이 view.traitCollection을 가져와 UITraitCollection.current에 값을 설정하는 것.

 

 

만약 Dynamic Color를 수동으로 결정해야 할 경우 다음과 같은 방법을 사용할 수 있다.

 

1. resolvedColor

let dynamicColor = UIColor.systemBackgrond
let traitCollection = view.traitCollection
let resolvedColor = dynamicColor.resolvedColor(with: traitCollection)

해당 방법은 traitCollection의 값을 통해 최종 색상을 결정하며 이렇게 결정된 색상은 스타일이 변경되더라도 다이나믹하게 바뀌지 않는다.

 

traitCollection의 값에 따라 하지 않고 좀 더 커스텀하게 하고 싶다면 다음과 같이 할 수 있다.

let dynamicColor = UIColor { (traitCollection: UITraitCollection) -> UIColor in
	if traitCollection,userInterfaceStyle == .dark {
    	return .black
    } else {
    	return .white
    }
}