[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Swift

[Swfit] resolvedColor(with:) / UITraitCollection.current

inu 2023. 10. 27. 00:03
반응형

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' 카테고리의 다른 글

[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
[Swift] Mirror  (0) 2023.05.18