- Published on
SwiftUI ilovani iPad, Landscape va Dark Mode uchun moslashtirish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
iPad simulatorida tekshirish
Xcode-da deployment targetni iPad Pro 12.9 inchga o'zgartirib, iPad simulatorida ishga tushiramiz.
Ilova unchalik yomon ko'rinmaydi β lekin list va pastki bar ekranning to'liq kengligi bo'ylab cho'zilib ketgan. iPad-da kontent odatda to'liq kenglikda emas, balki markazga tortilgan ko'rinadi. Shu muammoni tuzatamiz.
maxWidth β iPad uchun kenglik cheklovi
LocationsView-da yuqorida konstanta yaratamiz:
let maxWidthForIPad: CGFloat = 700
Header section uchun
Padding-dan keyin frame qo'shamiz:
.padding()
.frame(maxWidth: maxWidthForIPad)
iPhone β 700px-dan kichik, shuning uchun bu modifikator iPhone-ga ta'sir qilmaydi. iPad-da esa content 700px-dan kengayib ketmaydi.
Location preview section uchun
Bu yerda biroz murakkabroq: preview-ga maxWidth qo'shamiz, lekin transition animatsiyasi ekranning chetidan emas, content chetidan boshlanib qoladi. Buning vizual natijasi β content "pop" bo'lib paydo bo'ladi, silliq animatsiya bo'lmaydi.
Muammoni aniqlash uchun:
.frame(maxWidth: maxWidthForIPad)
.background(Color.green) // test uchun
Yashil rangdan ko'ramizki, transition β bu yashil maydonning chetigidan boshlanadi, ekran chetigidan emas.
Yechim: maxWidth frame-idan keyin, ekran kengligiga teng yana bir frame qo'shamiz:
.frame(maxWidth: maxWidthForIPad)
.frame(maxWidth: .infinity)
Endi transition birinchi (content) frame-dan emas, ikkinchi (ekran kengligidagi) frame-dan boshlanadi β animatsiya to'g'ri ishlaydi.
// Test ranglarini o'chiramiz
.frame(maxWidth: maxWidthForIPad)
.frame(maxWidth: .infinity)
Rasm karuselini iPad-ga moslashtirish
LocationDetailView-dagi imageSection-da:
.frame(width: UIScreen.main.bounds.width)
Bu qator β iPad-da sheet to'liq ekran kengligi bo'lmasligi sababli, rasmlar juda keng chiqib ketadi.
Yechim β ternary operator:
.frame(width: UIDevice.current.userInterfaceIdiom == .pad ? nil : UIScreen.main.bounds.width)
- iPad β
nil(frame-ni kontent o'zi belgilaydi) - iPhone β
UIScreen.main.bounds.width(oldingi xulq)
Endi iPad-da rasmlar sheet kengligiga mos bo'lib ko'rinadi.
Dark mode β nima uchun deyarli hech narsa qilish kerak bo'lmadi
iPad simulatorida Settings β Developer β Dark Appearance orqali qora rejimni yoqib ko'ramiz β ilova deyarli mukammal ko'rinadi.
Sababi β to'g'ri ranglardan foydalanganmiz:
Matnlar:
// titleSection-da foregroundColor ko'rsatilmagan
Text(location.name)
.font(.largeTitle)
.fontWeight(.semibold)
// foregroundColor ko'rsatilmasa, standart holda .primary ishlatiladi
// .primary β yorug' rejimda qora, qora rejimda oq (avtomatik)
Text(location.cityName)
.font(.title3)
.foregroundColor(.secondary)
// .secondary β ham avtomatik moslashadi
Agar biz Color.black yoki Color.white deb aniq yozganimizda, bu qora rejimda muammo keltirar edi. Ammo .primary va .secondary β ikkalasi ham avtomatik moslashadi.
Materiallar:
.background(.ultraThinMaterial) // LocationPreviewView
.background(.thickMaterial) // Back button
Barcha SwiftUI materiallar (ultraThinMaterial, thickMaterial va boshqalar) avtomatik ravishda yorug' va qora rejim uchun moslashadi β shu sababdan qo'shimcha hech narsa qilish kerak bo'lmadi.
Landscape rejimi
iPad β landscape qo'llab-quvvatlanadi
iPad-ni landscape rejimiga o'zgartiramiz β ilova chiroyli ko'rinadi, hech narsa o'zgartirishga hojat yo'q.
iPhone β faqat portrait
iPhone landscape rejimida ilova to'g'ri ko'rinmaydi β pastki preview juda katta joy egallaydi, sheet g'alati ko'rinadi. Shuning uchun iPhone uchun faqat portrait rejimini qo'llab-quvvatlaymiz.
Xcode β Project Navigator β Blue bar (project) β General β Deployment Info:
- iPhone tanlang β faqat Portrait belgisini qoldiring
- iPad tanlang β Portrait, Landscape Left, Landscape Right (barcha orientatsiyalar yaxshi ko'rinadi)
- Yana iPhone + iPad (ikkala qurilma) tanlang β deployment ikkalasiga bo'ladi
info.plist orqali tuzatish (Xcode 13 bug)
Ba'zan Xcode-da belgilangan orientatsiyalar info.plist-ga to'g'ri saqlanmaydi. Project Navigator β Info tab orqali tekshiramiz:
Supported interface orientations (iPad):
- Portrait (bottom home button)
- Landscape left (home button on right)
- Landscape right (home button on left)
Supported interface orientations (iPhone):
- Portrait (bottom home button)
- Landscape left β BU YO'Q BO'LISHI KERAK
- Landscape right β BU YO'Q BO'LISHI KERAK
Agar iPhone uchun landscape orientatsiyalar hamon ro'yxatda tursa, ularning yonidagi minus (-) tugmasini bosib o'chiramiz.
Endi iPhone landscape rejimida ishga tushirilsa ham, ilova portraitda qoladi.
Launch Screen qo'shish
Ilova birinchi ochilganda ko'rinadigan kirish ekrani (launch screen) qo'shamiz.
Project β Info tab β Launch Screen:
- "+" tugmasini bosib Image Name qo'shamiz
- Qiymat:
logo-launch(Assets-dagi rasm nomi bilan bir xil)
- Qiymat:
- "+" tugmasini bosib Background Color qo'shamiz
- Qiymat:
AccentColor(Assets-dagi accent color nomi bilan bir xil)
- Qiymat:
- Image respects safe area insets β
YES- Rasm ekranning chetlariga emas, safe area ichida ko'rinadi
Launch screen yangilanmasa
Agar simulator-da launch screen yangilanmasa:
- Simulatordagi ilovani o'chiring (delete)
- Simulatorni to'liq yoping
- Qaytadan build qiling β yangi simulator ochiladi, yangi launch screen o'rnatiladi
Storyboard bilan murakkab launch screen
Oddiy holatlar uchun info.plist usuli yetarli. Murakkabroq, to'liq moslashtirilgan launch screen kerak bo'lsa β Storyboard bilan alohida fayl yaratish tavsiya etiladi (bu usul ancha ko'p sozlanish imkoni beradi).
Ilova nomini o'zgartirish
Project β General β Display Name:
Swiftle Map App β My Locations
(Yoki o'zingiz xohlagan nom.)
Simulatorda qayta ishga tushirganda, ilova endi yangi nom bilan ko'rinadi.
Xulosa
Ilovani uchta yo'nalishda moslashtirishda qilgan ishlarimiz:
| Soha | Muammo | Yechim |
|---|---|---|
| iPad β kenglik | Content to'liq ekrancha cho'zilgan | maxWidthForIPad = 700 + .frame(maxWidth: .infinity) |
| iPad β rasmlar | Rasmlar sheet-dan kattaroq | UIDevice.current.userInterfaceIdiom == .pad ? nil : UIScreen.main.bounds.width |
| Transition | "Pop" effekti (silliq emas) | Ikkinchi .frame(maxWidth: .infinity) qo'shish |
| Dark mode | β | Hech narsa β .primary, .secondary, materiallar avtomatik ishladi |
| iPhone landscape | G'alati ko'rinish | info.plist-dan landscape orientatsiyalarni olib tashlash |
| Launch screen | Oddiy oq ekran | info.plist orqali rasm va fon rang belgilash |
| Ilova nomi | β | General β Display Name |
Asosiy xulosa: Ilovani qurayotganingizda dastlabki bosqichlardan boshlab adaptive ranglar (.primary, .secondary) va material fonlardan foydalanish β keyinchalik dark mode va iPad moslashtirishni deyarli avtomatik hal qiladi.