- Published on
Sheet va fullScreenCover
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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.
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
| Modifikator | Nima 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 dismiss | Dismiss 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.