Published on

SwiftUI-da Grid

Authors

LazyVGrid va LazyHGrid allaqachon mavjud edi, lekin iOS 16 da yangi komponent β€” oddiy Grid qo'shildi. U lazy emas (barcha elementlar darhol chiziladi), lekin sozlash imkoniyatlari ancha kengroq: ustun birlashtirish, alohida ustun hizalanishi, qator hizalanishi va boshqalar.


Yangi fayl yaratish

Navigatorda o'ng tugma bosib yangi SwiftUI fayli yarating. Uni GridViewBootcamp deb nomlang va Create tugmasini bosing.


Asosiy tushuncha β€” GridRow

Grid {
    GridRow {
        Text("1")
        Text("2")
        Text("3")
    }
    GridRow {
        Text("4")
        Text("5")
    }
}

Grid ichida GridRow orqali har bir qator belgilanadi. Turli qatorlarda elementlar soni har xil bo'lishi mumkin, lekin ustunlar baribir bir-biriga moslab tekislanadi β€” birinchi qatordagi birinchi element ikkinchi qatordagi birinchi element bilan bir ustunda joylashadi.


Yordamchi funksiya

Kodni qisqartirish uchun har bir katak (cell) uchun funksiya yaratamiz:

private func cell(_ value: Int) -> some View {
    Text("\(value)")
        .font(.largeTitle)
        .padding()
        .background(Color.blue)
}

4x4 grid yaratish

struct GridViewBootcamp: View {
    var body: some View {
        Grid {
            ForEach(0..<4) { rowIndex in
                GridRow {
                    ForEach(0..<4) { columnIndex in
                        let cellNumber = rowIndex * 4 + columnIndex + 1
                        cell(cellNumber)
                    }
                }
            }
        }
    }

    private func cell(_ value: Int) -> some View {
        Text("\(value)")
            .font(.largeTitle)
            .padding()
            .background(Color.blue)
    }
}

Natijada 1 dan 16 gacha bo'lgan raqamlar 4x4 jadval shaklida joylashadi.


Hizalanish β€” alignment

Grid(alignment: .leading) {
    // ...
}

Variantlar: .leading, .center (standart), .trailing va boshqalar.


Bo'shliqlar β€” horizontalSpacing va verticalSpacing

Grid(horizontalSpacing: 8, verticalSpacing: 50) {
    // ...
}
  • horizontalSpacing β€” ustunlar orasidagi masofa
  • verticalSpacing β€” qatorlar orasidagi masofa

Bo'sh katak yaratish

EmptyView() ishlatish to'g'ri natija bermaydi β€” chunki EmptyView umuman katak hisoblanmaydi, shuning uchun grid tuzilishi buziladi:

// ❌ Noto'g'ri β€” qator strukturasini buzadi
if cellNumber == 7 {
    EmptyView()
} else {
    cell(cellNumber)
}

To'g'ri yechim β€” ko'rinmas, lekin haqiqiy joy egallaydigan element ishlatish:

// βœ… To'g'ri β€” joy saqlanib qoladi, lekin ko'rinmaydi
if cellNumber == 7 {
    Color.clear
        .gridCellUnsizedSize(.horizontal)
} else {
    cell(cellNumber)
}

gridCellUnsizedSize β€” maksimal kengaytirishni o'chirish

Color yoki Divider kabi elementlar standart holatda mavjud bo'sh joyni to'liq egallaydi. Bu grid o'lchamini buzib yuborishi mumkin:

Divider()
    .gridCellUnsizedSize(.horizontal)

Bu modifier elementga "grid o'lchamidan tashqariga chiqma" deydi.


gridCellColumns β€” ustunlarni birlashtirish

Bitta katakni bir nechta ustun kengligiga cho'zish mumkin:

cell(cellNumber)
    .gridCellColumns(cellNumber == 6 ? 2 : 1)

Diqqat: katak ikki ustunni egallaganda, qolgan kataklar soni mos ravishda kamayadi. Agar qatorda ustunlar soni o'zgarmasligi kerak bo'lsa, kengaytirilgan katak o'rnini bo'sh katak bilan muvozanatlash kerak.


gridColumnAlignment β€” ustun bo'yicha alohida hizalanish

Har bir ustunga alohida hizalanish berish mumkin. Buning uchun shu ustundagi istalgan bitta katakka modifier qo'shish kifoya:

cell(cellNumber)
    .gridColumnAlignment(cellNumber == 1 ? .trailing : .center)

Bu modifier butun ustunning hizalanishini belgilaydi, faqat o'sha bitta katakni emas.


gridCellAnchor β€” katak ichidagi hizalanish

gridColumnAlignment butun ustunga ta'sir qilsa, gridCellAnchor faqat bitta katak ichidagi kontentning joylashuvini belgilaydi:

cell(cellNumber)
    .gridCellAnchor(.leading)

Bu ayniqsa gridCellColumns bilan kengaytirilgan kataklar uchun foydali β€” katak kengroq bo'lganda kontent uning ichida qayerda joylashishini belgilaydi.


Qator hizalanishi β€” GridRow(alignment:)

GridRow(alignment: .top) {
    cell(10)
        .frame(height: 20)
    cell(11)
}

Har bir GridRow o'z hizalanishiga ega bo'lishi mumkin β€” .top, .center, .bottom.


To'liq kod

struct GridViewBootcamp: View {
    var body: some View {
        Grid(
            alignment: .center,
            horizontalSpacing: 8,
            verticalSpacing: 8
        ) {
            ForEach(0..<4) { rowIndex in
                GridRow {
                    ForEach(0..<4) { columnIndex in
                        let cellNumber = rowIndex * 4 + columnIndex + 1

                        if cellNumber == 7 {
                            Color.clear
                                .gridCellUnsizedSize(.horizontal)
                        } else {
                            cell(cellNumber)
                                .gridCellColumns(cellNumber == 6 ? 2 : 1)
                                .gridColumnAlignment(
                                    cellNumber == 1 ? .trailing :
                                    cellNumber == 4 ? .leading : .center
                                )
                        }
                    }
                }
            }
        }
    }

    private func cell(_ value: Int) -> some View {
        Text("\(value)")
            .font(.largeTitle)
            .padding()
            .background(Color.blue)
    }
}

Modifier-lar xulosa jadvali

ModifierTa'sir doirasiVazifasi
Grid(alignment:)Butun gridUmumiy hizalanish
horizontalSpacing / verticalSpacingButun gridUstun/qator orasidagi masofa
gridCellUnsizedSizeBitta elementMaksimal kengaytirishni o'chiradi
gridCellColumnsBitta elementNecha ustunni egallashini belgilaydi
gridColumnAlignmentButun ustunUstunning hizalanishi
gridCellAnchorBitta katak ichiKatak ichidagi kontent joylashuvi
GridRow(alignment:)Bitta qatorQatorning hizalanishi

Grid va LazyVGrid β€” qaysi birini tanlash

LazyVGrid hamon o'z o'rniga ega β€” u uzun, aylanuvchan ro'yxatlar uchun samaraliroq, chunki faqat ekranda ko'rinadigan elementlarni chizadi. Grid esa barcha elementlarni darhol chizadi, lekin sozlash imkoniyatlari ancha boy β€” murakkab, statik jadval ko'rinishidagi dizaynlar uchun ko'proq mos keladi.


Xulosa

Bu videoda o'rgandik:

  • Grid va GridRow β€” qator va ustunlarni belgilash
  • alignment, horizontalSpacing, verticalSpacing β€” umumiy grid sozlamalari
  • gridCellUnsizedSize β€” elementni grid o'lchamidan tashqariga chiqishini cheklash
  • gridCellColumns β€” bir nechta ustunni birlashtirish
  • gridColumnAlignment β€” ustun bo'yicha alohida hizalanish
  • gridCellAnchor β€” katak ichidagi kontent joylashuvi
  • EmptyView() o'rniga bo'sh joy uchun Color.clear + gridCellUnsizedSize ishlatish kerak
Buy mea coffee