SwiftUI 기초(1)

Written by 이철우 on
SwiftUI 기초(1)

StackView의 종류

1. StackView란?

  • 스택뷰란 여러 뷰의 컬렉션을 세로 또는 가로로 레이아웃 하기 위해 사용하는 인터페이스이다.
  • 특히 오토 레이아웃에 있어서 큰 영향력을 발휘하고, 디바이스의 오리엔테이션에 따라 다이나믹하게 움직이는 뷰를 설계할 때 필수적인 요소이다.
  • 웹에서 사용하는 Flex를 떠올리면 쉽게 이해할 수 있을듯 하다.
  • 또한 UIKit으로 개발을 할 때는 선택적으로 사용을 했지만, SwiftUI에서는 거의 필수적인 요소라고 생각한다.

2. StackView의 종류

  • VStack
    • VStack 안의 자식들(children)을 세로로 정렬하는 뷰이다.
  • HStack
    • HStack 안의 자식들(children)을 세로로 정렬하는 뷰이다.
  • ZStack
    • ZStack 안의 자식들(children)을 중첩(Overlay)하는 뷰이다.
  • Spacer
    • StackView 내에서 나머지 공간을 채워줄 때 사용한다.
    • StackView의 종류는 아니지만, 경험상 개발할 때 개발하는 내내 VStack / HStack과 함께 항상 따라다녔다.

3. 사용법

  • 간단하게 각 스택뷰를 선언하고, 클로저 형태로 클로저 내에 내가 원하는 각종 뷰 요소들을 넣어주면 된다.

4. StackView의 파라미터

  • VStack
    init(alignment: HorizontalAlignment = .center, spacing: CGFloat? = nil, content: () -> Content)
    
  • HStack
    init(alignment: VerticalAlignment = .center, spacing: CGFloat? = nil, content: () -> Content)
    
  • ZStack

    init(alignment: Alignment = .center, content: () -> Content)
    
  • Spacer

    init(minLength: CGFloat?)
    
  • alignment: 각 스택 안의 자식 뷰들을 어떻게 정렬할 건지 속성을 부여해줄 수 있다.
    • 애플의 공식문서에서 발췌한 위의 파라미터를 보면 alignment 속성이 없으면 전부 .center로 배치된다
  • spacing: 자식 뷰들의 간격을 부여해줄 수 있다. (ZStack은 중첩이기 때문에 해당 파라미터가 없다.)
    • 마찬가지로 파라미터 값을 부여해주지 않으면 nil이 되어 자식뷰들 사이의 간격이 없어진다.
  • content: 각 뷰 안에 들어갈 자식 뷰를 넣어준다.
  • Spacer의 minLength: 최대로 줄어들 수 있는 길이이다.

5. 사용 예

  • VStack

    • VStack 내의 모든 뷰 요소가 세로로 정렬된다.
    • alignment를 leading으로 선언하여 뷰의 요소들이 모두 왼쪽으로 붙었다.

      VStack(alignment: .leading) {
      
        Rectangle()
                .frame(width: 200, height: 20)
      
        Text("1")
      
        Text("2")
      
        Text("3")
      } //: V
      

  • HStack

    • HStack 내의 모든 뷰 요소가 가로로 정렬된다.
    • Spacer로 인해 1과 2 사이의 간격이 벌어졌고,
    • spacing을 50으로 선언하여 각 자식뷰의 사이가 50 포인트씩 벌어진 상태이다.

      HStack(spacing: 50) {
      
        Text("1")
      
        Spacer(minLength: 0)
      
        Text("2")
      
        Text("3")
      } //: H
      

  • ZStack

    • ZStack 내의 모든 뷰 요소가 중첩된다.

        ZStack {
      
          Text("1")
      
          Text("2")
      
          Text("3")
        } //: Z
      

  • 번외로 VStack, HStack, ZStack 등을 모두 활용하면 아래 처럼 눈사람도 만들 수 있다.

예제 프로젝트