Dynamic Type — iOS-ning o'rnatilgan funksiyasi bo'lib, u ilovadagi shrift o'lchamini foydalanuvchining tizim sozlamalariga mos ravishda avtomatik o'zgartiradi. Foydalanuvchi Sozlamalar → Ekran va yorqinlik → Matn o'lchami bo'limida afzal ko'rgan matn o'lchamini belgilaydi va Dynamic Type-ni qo'llab-quvvatlovchi barcha ilovalar qo'shimcha harakatlarsiz moslashadi. Apple Human Interface Guidelines, 2024 ma'lumotlariga ko'ra, Dynamic Type qo'llab-quvvatlashi App Store da nashr qilish uchun majburiy talabdir, chunki bu iOS platformasida foydalanish qulayligining asosiy elementidir.
Asosiy
Dynamic Type — iOS 7 da paydo bo'lgan iOS texnologiyasi bo'lib, ilovadagi matnni tizim shrift o'lchami sozlamalariga avtomatik moslashtirish imkonini beradi. Foydalanuvchi bir vaqtning o'zida barcha ilovalarda shriftni kattalashtirishi yoki kichiklashtirishi mumkin — har bir ilova sozlamalarini alohida o'zgartirishga hojat yo'q.
Apple WWDC 2023, “Make Your App Visually Accessible” ma'lumotlariga ko'ra, iOS foydalanuvchilarining 40% dan ortig'i shrift o'lchamini standartdan o'zgartiradi. 65+ yosh guruhi uchun bu ko'rsatkich 70% ga etadi. Dynamic Type App Store foydalanish qulayligi sertifikati uchun majburiy talabdir. Qo'llab-quvvatlashning yo'qligi ilovani ko'rib chiqishda rad etishga sabab bo'ladi.
Ishlash printsipi: ilova UIFont(name:size:) o'rniga UIFont.preferredFont(forTextStyle:) dan foydalanadi. iOS joriy tizim sozlamasiga mos masshtablangan shriftni avtomatik qaytaradi. Sozlamalarda o'lcham o'zgartirilganda, iOS UIContentSizeCategory.didChangeNotification bildirishnomasini yaratadi — ilova tartibni qayta hisoblashi kerak.
Dynamic Type iOS 7 da “yassi” dizayn bilan birga paydo bo'ldi. iOS 10 da UIFontMetrics orqali maxsus shriftlarni qo'llab-quvvatlash qo'shildi. iOS 11 foydalanish qulayligi darajalarini (AccessibilityXXXL gacha) taqdim etdi. iOS 15 SwiftUI da avtomatik qo'llab-quvvatlash bilan Dynamic Type qo'shdi. Har bir versiyada Apple talablarni kuchaytiradi: iOS 17 dan boshlab, Dynamic Type qo'llab-quvvatlamaydigan ilovalar App Store Connect ga yuklashda ogohlantirish oladi.
iOS standart sozlama uchun har biri oldindan belgilangan o'lcham va shrift xususiyatiga ega 8 matn uslubini taqdim etadi:
| Uslub | Doimiy | O'lcham (L) | Vazifa |
|---|---|---|---|
| Large Title | .largeTitle | 34px | Ekranning asosiy sarlavhasi |
| Title 1 | .title1 | 28px | Bo'lim sarlavhasi |
| Title 2 | .title2 | 22px | Ostsarlavha |
| Title 3 | .title3 | 20px | Karta sarlavhasi |
| Headline | .headline | 17px (bold) | Urg'u uchun qalin |
| Body | .body | 17px | Asosiy matn |
| Callout | .callout | 16px | Yordamchi matn |
| Caption 1 | .caption1 | 12px | Rasm ostidagi yozuv |
| Caption 2 | .caption2 | 11px | Kichik yozuv |
| Footnote | .footnote | 13px | Izoh, eslatma |
To'g'ri uslubdan foydalanish shunchaki “tashqi ko'rinish” emas. AccessibilityXXXL rejimida UIFont.TextStyle.body 53px ga yetishi mumkin. Agar ilova body uchun 17px qat'iy shriftdan foydalansa, shriftni kattalashtirgan foydalanuvchilar uchun matn o'qib bo'lmaydigan bo'lib qoladi.
Dynamic Type nafaqat masshtablaydi — vizual ierarxiyani saqlaydi. Large Title har doim Title 1 dan katta, u esa Body dan katta, masshtablash darajasidan qat'iy nazar. Masshtablash koeffitsientlari farqlanadi: sarlavhalar asosiy matnga qaraganda faolroq masshtablanadi, shunda ierarxiya hatto foydalanish qulayligi darajalarida ham saqlanadi.
iOS ikki toifaga bo'lingan 11 daraja matn masshtablashni qo'llab-quvvatlaydi:
Body uslubi uchun XS va AccessibilityXXXL o'rtasidagi farq 14px dan 53px gacha — taxminan 4×. 17px uchun mo'ljallangan tartib 53px da butunlay buziladi: matn chegaralardan chiqadi, tugmalar bir-birining ustiga chiqadi, hujayralar bir-biriga kiradi.
Koddagi joriy toifani tekshiring:
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
// Muqobil tartibni yoqish
}
Matn o'lchami toifasi traitCollection.uiContentSizeCategory orqali mavjud. Tizim sozlamasi o'zgartirilganda, iOS barcha UIView larda traitCollectionDidChange ni chaqiradi. Bu usulda shriftlarni yangilash va tartibni qayta hisoblash kerak. SwiftUI buni avtomatik bajaradi — UIKit qo'lda obuna bo'lishni talab qiladi.
UICollectionView uchun UICollectionViewCompositionalLayout dan foydalaning — u ustunlar sonini ekran kengligi va matn o'lchamiga avtomatik moslashtiradi. Foydalanish qulayligi darajalarida ikki ustunli tartibdan bir ustunliga o'ting, shunda matn kesilmaydi va elementlar bir-birining ustiga chiqmaydi. Shartli tartibdan foydalaning: regular width uchun — ikki ustun, compact yoki accessibility uchun — bir ustun.
UIKit da asosiy tatbiq — UIFont.preferredFont(forTextStyle:). Bu usul joriy tizim sozlamasiga mos masshtablangan shriftni qaytaradi:
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)
Maxsus shriftlar uchun UIFontMetrics dan foydalaning:
let customFont = UIFont(name: "Montserrat-Regular", size: 16)!
titleLabel.font = UIFontMetrics(forTextStyle: .body)
.scaledFont(for: customFont)
// O'lcham o'zgarishlarini kuzatish
NotificationCenter.default.addObserver(
self,
selector: #selector(preferredContentSizeChanged),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
UILabel uchun Interface Builder da shriftni matn uslubi (Text Style) sifatida o'rnatish va “Automatically Adjusts Font” ni yoqish kifoya. Maxsus shriftlar uchun IB UIFontMetrics ni qo'llab-quvvatlamaydi — faqat kod orqali.
UIFontMetrics preferredFont bilan bir xil masshtablash egri chizig'idan foydalanadi. fromTextStyle: .body, .headline va hokazolarni o'rnatishingiz mumkin. Har bir uslubning o'z masshtablash koeffitsienti bor. Body mo''tadil masshtablanadi, Large Title — agressiv. Agar maxsus shrift asosiy matn uchun ishlatilsa, .body dan foydalaning.
SwiftUI da Dynamic Type qo'llab-quvvatlashi sukut bo'yicha o'rnatilgan. Barcha tizim modifikatorlari (.font(.body), .font(.title)) avtomatik masshtablanadi. Dasturchi UIFont.preferredFont ni chaqirishi shart emas.
Misol:
Text("Asosiy matn")
.font(.body)
.lineLimit(nil)
.minimumScaleFactor(0.5)
Maxsus masshtablar uchun DynamicTypeSize dan foydalaning:
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
Text("Moslashuvchan matn")
.font(.body)
.padding(dynamicTypeSize <= .large ? 8 : 16)
}
SwiftUI tizim matn o'lchami o'zgarganda ko'rinishni avtomatik yangilaydi — qo'shimcha bildirishnomalarga obuna bo'lish shart emas.
.font(.body) modifikatori faqat tizim shrifti uchun ishlaydi. SwiftUI da maxsus shriftlar uchun tagida UIFontMetrics bilan Font.custom dan foydalaning. iOS 16 dan boshlab, SwiftUI @Environment da DynamicTypeSize ni qo'llab-quvvatlaydi, bu esa bo'shliqlar va tartibni moslashtirish imkonini beradi.
Auto Layout — Dynamic Type qo'llab-quvvatlashining majburiy sharti. Qat'iy kenglik va balandliklar (>=, <=) foydalanish qulayligi o'lchamlarida buziladi. UILabel uchun intrinsicContentSize dan foydalaning — u joriy shrift o'lchami bo'yicha balandlikni avtomatik hisoblaydi.
Moslashuvchan tartib qoidalari:
Uzoq matnlar uchun (masalan, maqolalar, foydalanish shartlari) UILabel da minimumScaleFactor ni o'rnating — bu Auto Layout tarkibni sig'dira olmaganda oxirgi chora sifatida matnni kichiklashtiradi. 0.5 qiymati shrift afzal ko'rilgan o'lchamning 50% gacha kichiklashishi mumkinligini anglatadi.
Bo'shliqlarni o'lcham toifasiga moslashtirish misoli:
let isAccessibility = traitCollection
.preferredContentSizeCategory.isAccessibilityCategory
stackView.spacing = isAccessibility ? 16 : 8
button.contentEdgeInsets = isAccessibility
? UIEdgeInsets(top: 16, left: 24, bottom: 16, right: 24)
: UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
Matnning kesilishi — numberOfLines = 1 va qat'iy kenglikdagi UILabel AccessibilityXL da matnni kesadi. Yechim: numberOfLines = 0 va trailing constraint. Elementlarning ustma-ust tushishi — qat'iy balandlikdagi tugmalar bir-birining ustiga chiqadi. Yechim: automatic spacing bilan UIStackView. Ekrandan chiqib ketish — foydalanish qulayligi darajalarida ScrollView majburiy.
Xcode simulyatori matn o'lchamini o'zgartirish imkonini beradi: simulyator menyusida Settings → Accessibility → Display & Text Size → Larger Text. Barcha 11 daraja o'rtasida o'ting va matn kesilmayotganini, tugmalar mavjudligini va tartib buzilmaganligini tekshiring.
Avtomatlashtirilgan sinov uchun XCUIApplication da contentSizeCategory sozlamasidan foydalaning:
func testAccessibilitySizes() {
let app = XCUIApplication()
app.launchArguments += [
"-UIPreferredContentSizeCategoryName",
"UICTContentSizeCategoryAccessibilityXXXL"
]
app.launch()
app.scrollViews.buttons["Yuborish"].tap()
XCTAssertTrue(app.staticTexts["Forma yuborildi"]
.waitForExistence(timeout: 5))
}
XCUITest turli launchArguments bilan CI da barcha masshtablash darajalarini tekshirish imkonini beradi. Foydalanish qulayligi toifalarini alohida tekshirishni unutmang — ular ko'pincha tartibni buzadi. Apple ma'lumotlariga ko'ra, Dynamic Type xatolarining 70% aynan foydalanish qulayligi darajalarida aniqlanadi, chunki dasturchilar faqat standart o'lchamlarni sinab ko'rishadi.
Xcode Accessibility Inspector tanlangan element qanday shriftlardan foydalanayotganini ko'rsatadi — qat'iy yoki masshtablanadigan. Agar element simulyatorda matn o'lchami o'zgarishiga javob bermasa, bu qat'iy shrift ishlatilayotganini anglatadi. Uni UIFont.preferredFont yoki UIFontMetrics bilan almashtiring.
Tez-tez beriladigan savollar
Bu ilovada matnning tizim o'lcham sozlamalariga mos ravishda avtomatik masshtablanishi. Foydalanuvchi Sozlamalarda o'lchamni o'zgartiradi — barcha qo'llab-quvvatlovchi ilovalar dasturchi ishtirokisiz moslashadi.
Yo'q. Maxsus shriftlar uchun UIFontMetrics(scaledFont:) dan foydalaning. Usul har qanday shriftni belgilangan matn uslubiga nisbatan masshtablaydi, nisbatlarni saqlaydi.
11 daraja: 5 standart (XS, S, M, L, XL) va 6 foydalanish qulayligi darajasi (AccessibilityXL dan AccessibilityXXXXXL gacha). Body shriftining o'lchami 14px dan 53px gacha o'zgarishi mumkin.
UIKit da UIContentSizeCategory.didChangeNotification orqali. SwiftUI da @Environment(\.dynamicTypeSize) dan foydalaning — tizim sozlamasi o'zgarganda ko'rinish avtomatik yangilanadi.
Kattalashtirilgan shriftli foydalanuvchilar kesilgan matn, ustma-ust tushgan elementlar va ishlamaydigan tugmalarni ko'radi. Ilova foydalanish qulayligi talablarini buzganligi uchun App Store ko'rib chiqishida rad etilishi mumkin.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.