【SwiftUI】表の作成などに使えるLazyVGrid

この記事は約4分で読めます。

LazyVGridは表の作成などに用いると便利なViewです。
以下のようにcolumnsプロパティに表示する列の設定をすると、コンテンツ部分を列の設定に従って表示してくれます。

シンプルなコード例

import SwiftUI

struct LazyVGridSample: View {
    //列に関する設定
    let columns: [GridItem] = Array(repeating: GridItem(.flexible()), count: 7)
    var body: some View {
        VStack {
             ScrollView {
                 Text("LazyVGrid")
                 LazyVGrid(columns: columns) {
                     //コンテンツ部分
                     ForEach(1...31, id: \.self) { value in
                         Text(String(format: "%d", value))
                             .font(.largeTitle)
                     }
                 }
             }
        }
    }
}

LazyVGridのパラメータ

columnsGridItem型の配列を指定する。GridItem自体にもパラメータがある。
alignmentグリッド内に表示する項目の配置、中央寄せ(.center)、右寄せ(.trailing)、左寄せ(.leading)が設定可能
spacing行と行の間のスペースの高さ
pinnedViewsスクロールした時にピン留めしたいヘッダービュー(.sectionHeaders)やフッタービュー(.sectionFooters)

GridItemのパラメータ

sizeGridItemのサイズ。以下の3つから指定できます。
・固定のサイズ(.fixed)
・最小と最大で設定した値の範囲内で画面に収まるサイズ(.flexible)
・使い所がわからなかった(.adaptive)
spacingGridItem間のサイズ
alignmentGridItemの配置

パラメータを色々変更したコード例

import SwiftUI

struct LazyVGridSample: View {
    //列に関する設定
    let columns: [GridItem] = Array(repeating: GridItem(
                                            //GridItemの初期化
                                            .flexible(minimum: 10, maximum: 100),
                                            spacing: 10,
                                            alignment: .bottomLeading),
                                    count: 7)
    var body: some View {
        VStack {
             ScrollView {
                 //Text("LazyVGrid")
                 LazyVGrid(columns: columns, alignment: .center, spacing: 50, pinnedViews: .sectionFooters ) {
                     Section(header: Text("LazyVGrid")) {
                         //コンテンツ部分
                         ForEach(1...31, id: \.self) { value in
                             Text(String(format: "%d", value))
                                 .font(.largeTitle)
                         }
                     }
                 }
             }
        }
    }
}
タイトルとURLをコピーしました