Published on

SwiftUI ilovani iPad, Landscape va Dark Mode uchun moslashtirish

Authors

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:

  1. iPhone tanlang β†’ faqat Portrait belgisini qoldiring
  2. iPad tanlang β†’ Portrait, Landscape Left, Landscape Right (barcha orientatsiyalar yaxshi ko'rinadi)
  3. 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:

  1. "+" tugmasini bosib Image Name qo'shamiz
    • Qiymat: logo-launch (Assets-dagi rasm nomi bilan bir xil)
  2. "+" tugmasini bosib Background Color qo'shamiz
    • Qiymat: AccentColor (Assets-dagi accent color nomi bilan bir xil)
  3. Image respects safe area insets β†’ YES
    • Rasm ekranning chetlariga emas, safe area ichida ko'rinadi

Launch screen yangilanmasa

Agar simulator-da launch screen yangilanmasa:

  1. Simulatordagi ilovani o'chiring (delete)
  2. Simulatorni to'liq yoping
  3. 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:

SohaMuammoYechim
iPad β€” kenglikContent to'liq ekrancha cho'zilganmaxWidthForIPad = 700 + .frame(maxWidth: .infinity)
iPad β€” rasmlarRasmlar sheet-dan kattaroqUIDevice.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 landscapeG'alati ko'rinishinfo.plist-dan landscape orientatsiyalarni olib tashlash
Launch screenOddiy oq ekraninfo.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.

Buy mea coffee