SwiftUI : EnvironmentValues
EnvironmentValues
에 대해 알아보도록 합시다.
Environment
SwiftUI
에서는 뷰를 구성하는 데 필요한 각종 환경 설정과 관련된 정보를 EnvironmentValues
타입이 관리합니다.
colorScheme
, timeZone
, locale
, calendar
, layoutDirection
, sizeCategory
, undoManager
등 기존에는 UITraitCollection
을 비롯해 다양한 클래스에서 나뉘어 사용하고 관리되던 속성들을 이제 EnvironmentValues
하나에 모두 담아서 쉽게 접근하고 관리할 수 있습니다.
이 EnvironmentValues
는 프레임워크에 의해 별도로 관리되고 있으므로 어떤 뷰에서든 접근할 수 있는데, 이때 얻게 되는 값은 상위 계층의 뷰가 가진 환경 요소를 그대로 상속받게 됩니다. 단, 하위 계층에 있는 뷰에서 개별적으로 다른 환경을 구성했다면 그 뷰에 속한 자식 뷰들은 변경된 값을 우선 사용하게 됩니다.
위 그림을 보게 되면 ColorScheme
을 최상위 뷰에 dark
로 지정하면 그 자식 뷰 들은 자동으로 DarkMode
가 됩니다. 하지만 자식 뷰 중 하나에 light
값을 주게 되면, 해당 뷰와 그 뷰의 아래 있는 뷰는 LightMode
가 기본값이 됩니다. 이렇게 SwiftUI
의 각 환경 요소는 뷰 계층 구조에 영향을 받으며, 동적으로 제어할 수 있습니다.
EnvironmentValues 예시
Environment
는 사용된 뷰와 그 뷰의 서브 트리에 대해 EnvironmentValues
의 특정 요소를 원하는 값으로 변경시키기 위한 수식어 입니다.
Accessing Color Schemes | Accessing View Settings |
colorScheme | calendar |
ColorScheme | edithMode |
colorSchemeConrast | isEnabled |
ColorSchemeConrast | locale |
PresentationMode | |
timeZone | |
layoutDirection | |
sizeCategory | |
undoManager |
이들 중 하나의 값을 선택하여 설정하는거겠죠?
사용예시
예시를 하나 들어보겠습니다.
@Environment(\.colorScheme) var colorScheme: ColorScheme
contentView에 위처럼 정의를 하고 아래와 같이 활용합니다.
if colorScheme == .dark {
DarkContent()
} else {
LightContent()
}
공식 문서에 따르면
- 값이 변하면 뷰도 그에 값에 맞춰 변합니다.
- 프로퍼티 래퍼는 설정하지 않으면 기본적으로 Default 입니다.
- 오버라이드를 할 수 있고 커스텀할 수도 있습니다.
- 좀 더 자세한 정보를 원하면
EnvironmentKey
(protocol) 를 확인 하면 됩니다.
만약 내가 기본값으로 되어있는 뷰의 특정 속성을 변경하고싶다 라는 생각이 들면 EnvironmentValues
를 사용 하면 됩니다.
읽어주셔서 감사합니다🤟