Published on

Sheet va fullScreenCover

Authors

Push navigatsiya yangi ekranni ko'rsatishning yagona usuli emas. Ba'zan ekran yondan kirishining o'rniga pastdan yuqoriga siljib kirishi kerak β€” xuddi Mail-da "Yangi xabar" yoki KalendarΠ΄Π° "Yangi tadbir" tepganingizdagi kabi. Mana shu pastdan yuqoriga taqdimot modal deyiladi, va SwiftUI-da buning uchun ikkita modifikator mavjud: .sheet va .fullScreenCover.

Asosiy farq qanchalik ekranni qoplashida. Sheet yuqoriga siljib, tagdagi ekranning bir qismini ko'rinib tursin deb qoldiradi β€” foydalanuvchi vaqtincha asosiy viewdan ketayotganini sezadi. FullScreenCover butun ekranni egallaydi, xuddi push navigatsiya kabi, lekin pastdan kiradi. Vaqtinchalik formalar, filtr panellari va o'z nav bar-iga muhtoj bo'lmagan detallar uchun sheet; login ekranlari yoki kamera viewlari kabi narsa uchun fullScreenCover ishlating.

Ikkisi ham bir xil asosda ishlaydi: ularni Bool-ga bog'laysiz. Bool true bo'lganda sheet ko'rinadi. False bo'lganda sheet yopiladi.

Swift
ContentView.swift
import SwiftUI struct ContentView: View { // @State bool sheet ko'rinib turganini boshqaradi @State private var showSheet = false var body: some View { Button("Sheet-ni ochish") { // True-ga o'rnatish sheet-ni paydo qiladi showSheet = true } // .sheet bool-ni kuzatadi β€” true bo'lganda paydo bo'ladi, false bo'lganda yopiladi .sheet(isPresented: $showSheet) { SheetContentView() } } } struct SheetContentView: View { // @Environment(\.dismiss) dismiss amaliyotiga kirish imkonini beradi @Environment(\.dismiss) var dismiss var body: some View { VStack { Text("Bu sheet") // dismiss() chaqirish sheet-ni ichidan yopadi Button("Yopish") { dismiss() } } } }

Sheet variantlari

.fullScreenCover

// Xuddi .sheet bilan bir API β€” faqat modifier nomini almashtiring
.fullScreenCover(isPresented: $showCover) {
    LoginView()
}

To'liq egallovchi tajribalar uchun fullScreenCover ishlating β€” login/onboarding ekranlari, kamera viewlari yoki vaqtinchalik bo'lmasligi kerak bo'lgan modal. Foydalanuvchi uni sheet kabi sudrab yopa olmaydi; u faqat dismiss() orqali yoki koddan yopiladi.

.sheet(item:)

// selectedFruit nil bo'lmasa, sheet shu meva-ning datasi bilan ochiladi
@State private var selectedFruit: String? = nil

Button("Olmani ko'rsatish") {
    selectedFruit = "Olma"
}
// sheet(item:) ixtiyoriy Identifiable qiymat oladi β€” nil bo'lmasa paydo bo'ladi
.sheet(item: $selectedFruit) { meva in
    // meva β€” unwrap qilingan qiymat, to'g'ridan-to'g'ri mavjud
    MevaDetailView(meva: meva)
}

Sheet-ga data o'tkazish kerak bo'lganda, ixtiyoriy-ga bog'lash alohida Bool va alohida o'zgaruvchidan tozaroq. Optional-ni element-ga o'rnating va sheet u bilan ochiladi. Nil-ga o'rnating va sheet yopiladi.

.presentationDetents()

.sheet(isPresented: $showSheet) {
    FilterView()
        // Sheet o'rta balandlikda to'xtaydi β€” foydalanuvchi kengaytirish uchun sudray oladi
        .presentationDetents([.medium, .large])
}

Odatda sheet ekranning ko'p qismini egallaydi. Filtr panellari, tezkor amallar yoki qo'shimcha kontent uchun mukammal bo'lgan, o'rta balandlikdan boshlanuvchi pastki sheet uchun .presentationDetents ishlating. iOS 16+.

Keng tarqalgan xato: Foydalanuvchi pastga siljitib sheet-ni yopishi mumkinligini unutmang. Agar sheet-ingizda saqlanmagan o'zgarishlar bo'lsa, bu holatni hal qilishingiz kerak β€” tasodifiy yopishning oldini olish uchun sheet mazmunida .interactiveDismissDisabled() modifikatorini ishlating.

Tezkor ma'lumotnoma

ModifikatorNima qiladi
.sheet(isPresented: $bool) { View }View-ni pastdan modal sifatida ko'rsatadi; Bool ko'rinishni boshqaradi
.fullScreenCover(isPresented: $bool) { View }Sheet bilan bir xil, lekin butun ekranni egallaydi; slayd bilan yopilmaydi
.sheet(item: $ixtiyoriy) { element in View }Ixtiyoriy dataga bog'langan sheet β€” nil bo'lmasa paydo bo'ladi
@Environment(\.dismiss) var dismissDismiss amali β€” yopish uchun dismiss() chaqiring
.presentationDetents([.medium, .large])O'rta balandlikdan boshlanadigan, kengaytirilishi mumkin sheet (iOS 16+)
.interactiveDismissDisabled()Slayd bilan yopishni o'chiradi β€” saqlanmagan data uchun foydali

Topshiriq: "yangi element" shakli

"Yangi element" tugmasi bilan ContentView yarating. U sheet-ni ochsin. Sheet-da matn maydoni (hozircha ishlamasligi mumkin), uni yopuvchi "Saqlash" tugmasi va "Bekor qilish" tugmasi bo'lsin. Sheet-ni o'rta balandlikka qilish uchun .presentationDetents([.medium]) qo'shing. Simulyatorda sinab ko'ring.

Buy mea coffee