SWIFTUI/Grammar

SwiftUI : EnvironmentValues

서근 2021. 4. 5. 23:52
반응형

 

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) 를 확인 하면 됩니다.

TIP
 
 

만약 내가 기본값으로 되어있는 뷰의 특정 속성을 변경하고싶다 라는 생각이 들면 EnvironmentValues를 사용 하면 됩니다.

 

 

읽어주셔서 감사합니다🤟