카테고리 없음

SwiftUI에서 Grid를 표현하는 방법: LazyVGrid, LazyHGrid, GridItem

ragdoll-cat 2025. 1. 30. 19:01

Stack과 List를 사용하여 콘텐츠를 표시할 수 있지만 SwiftUI는 multi-column grid를 표시할 수 있는 방법이 있습니다. 바로 LazyVGrid, LazyHGrid, GridItem 입니다.


GridItem

GridItem은 LazyHGrid의 행 또는 LazyVGrid의 열을 나타냅니다. 

GridItem(sizing, spacing: CGFloat?, alignment: Alignment?)

sizing은 GridItem.Size 타입으로, 선언될 수 있는 값은 다음과 같습니다.

  • flexible() - 그리드의 행 또는 열의 수는 그리드에 전달된 GridItem의 인스턴스 수에 따라 결정됩니다.
  • adaptive(minimum: CGFloat) - 행 또는 열의 크기는 사용 가능한 공간에 가능한 한 많은 항목을 표시하도록 조정됩니다.
  • fixed(size: CGFloat) - 각 항목의 크기는 고정된 크기를 갖습니다.

LazyVGrid

수직으로 항목이 배치되는 수직 그리드입니다.

 
LazyVGrid(
  columns: [GridItem], 
  alignment: HorizontalAlignment, 
  spacing: CGFloat?,
  pinnedViews: PinnedScrollableViews,
  content: () -> Content
)
 

다음 예제에서는 GridItem을 사용하여 텍스트와 이미지를 표현하는 수직 그리드를 나타냅니다.

struct VerticalSmileys: View {
  let columns = [GridItem(.flexible()), GridItem(.flexible())]
  
  var body: some View {
    ScrollView {
      LazyVGrid(columns: columns) {
        ForEach(0x1f600...0x1f679, id: \.self) { value in
          Text(String(format: "%x", value))
          Text(emoji(value))
            .font(.largeTitle)
        }
      }
    }
  }

  private func emoji(_ value: Int) -> String {
    guard let scalar = UnicodeScalar(value) else { return "?" }
    return String(Character(scalar))
  }
}

 

 

LazyHGrid

수평으로 항목이 배치되는 그리드입니다.

LazyHGrid(
  rows: [GridItem],
  alignment: VerticalAlignment, 
  spacing: CGFloat?, 
  pinnedViews: PinnedScrolableViews, 
  content: () -> Content
)

 

다음 예제에서는 GridItem을 사용하여 텍스트와 이미지를 표현하는 수 그리드를 나타냅니다.

struct ContentView: View {
  let rows = [GridItem(.fixed(30)), GridItem(.fixed(30))]

  var body: some View {
    ScrollView(.horizontal) {
      LazyHGrid(rows: rows) {
        ForEach(0x1f600...0x1f679, id: \.self) { value in
          Text(String(format: "%x", value))
          Text(emoji(value))
            .font(.largeTitle)
        }
      }
    }
  }

  private func emoji(_ value: Int) -> String {
    guard let scalar = UnicodeScalar(value) else { return "?" }
    return String(Character(scalar))
  }
}

 

 

Grid

비교적 최근에 추가된 API인 Grid도 존재합니다. 정적인 Grid를 표현할 때 사용합니다.

Grid는 iOS 16부터 추가된 기능이므로 사용하려면 iOS 16.0 이상의 버전을 타겟으로 설정해야 합니다.
Grid는 GridRow를 사용합니다.

Grid {
  GridRow {
    Text("Hello")
    Image(systemName: "globe")
  }
  GridRow {
    Image(systemName: "hand.wave")
    Text("World")
  }
}