천천히 알아보기 위해 편하게 작성하겠습니다.
앱의 모든 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을 구성할까?
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
}
}
'iOS' 카테고리의 다른 글
UIView - bounds and frame 2탄 (0) | 2023.06.20 |
---|---|
UICollectionView - invalidateLayout() (0) | 2023.06.19 |
UIView - Content Hugging, Content Comporession Priorities (0) | 2023.06.07 |
[iOS] Framwork? Liberary? 프레임워크와 라이브러리의 차이 (0) | 2022.09.14 |
[iOS] 오토 레이아웃(Auto Layout) (0) | 2022.03.21 |