반응형
resolvedColor(with:)
- UIColor의 Instance Method인 resolvedColor는 주어진 trait을 기반으로 UIColor를 resolve합니다. 해당 UIColor가 다크모드를 지원하는 Dynamic Color일 경우 현재 다크모드 스타일에 맞는 Color를 반환합니다.
- Core Graphics의 Color 요소인 CGColor는 Dynamic Color를 지원하지 않습니다. 이러한 특징때문에 CGColor를 필요로하는 요소에서는 다크모드가 자동으로 적용되지 않습니다.
let black = UIColor.myBlack.cgColor
- 이 과정에서 resolve가 일어납니다. cgColor는 Dynamic Color를 지원하지 않기때문에 현재의 trait에 맞춰 resolve하고 그 Color값을 기반으로 cgColor를 return합니다.
- UIColor와는 다르게 이렇게 반영된 Color는 이미 Dynamic하게 Color를 적용할 수 없는 상태가 되었기 때문에 다크모드 변경에도 반응하지 않습니다.
- 예를 들어 특정 요소의 layer에 borderColor를 적용하는 경우에는 CGColor를 사용합니다. 따라서 기기의 다크모드 상태를 변경하더라도 바로 반영되지 않습니다. 추가적인 처리가 필요합니다.
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
view.traitCollection.performAsCurrent {
button.layer.borderColor = UIColor.border.cgColor
}
}
- traitCollection이 변경될 때마다 이를 확인하고 반영해주어야합니다.
traitCollectionDidChange(_ previousTraitCollection:)
메서드를 override해서 이를 확인할 수 있습니다. performAsCurrent(_:)
메서드는 현재 trait 상태에 맞춰서 동작이 일어날 수 있도록 도와줍니다. 이를 기반으로 동작을 수행해야 안정적으로 resolve 반영이 가능합니다.
UITraitCollection / current
- UITraitCollection은 현재 사용자의 인터페이스에 관한 정보들이 들어있는 객체입니다.
- 그 중 Type property인 current를 이용하면 '현재 실행 컨텍스트'에서의 TraitCollection을 받아올 수 있습니다.
- UIColor에서 CGColor를 반환하며 resolve할 때도 내부적으로 이 값을 기반으로 resolve 처리를 하게됩니다.
반응형
'🍎 Apple > Swift' 카테고리의 다른 글
[CloudKit] 기본 개념 및 사용법 (0) | 2024.06.07 |
---|---|
[WWDC22] Link fast: Improve build and launch times (0) | 2024.04.08 |
[Swift] Attributes (2) | 2023.07.29 |
[Swift] AVFoundation 기초 (0) | 2023.07.15 |
[Swift][문서의역] Macro (4) | 2023.07.15 |