Dynamic Type: asosiy tushunchalar, matn uslublari va iOS da qanday ishlaydi

Muallif: IT Sectr Nashr etilgan: 2026-05-16 O'qish vaqti: 9 daq

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 — matnni tizim shrift o'lchami sozlamalariga mos ravishda avtomatik masshtablash uchun iOS mexanizmi
  • Qo'llab-quvvatlash matn uslublari (UIFont.TextStyle) — body, headline, caption, title va boshqalar orqali ta'minlanadi
  • Tizim XSmall dan AccessibilityXXXL gacha 11 daraja masshtablashni qo'llab-quvvatlaydi
  • Maxsus shriftlar uchun UIFontMetrics usuli qo'llaniladi, u har qanday shriftni body uslubiga nisbatan masshtablaydi
  • Tartib moslashuvchan bo'lishi kerak — UIStackView, Auto Layout va dinamik hujayra balandligi majburiy

iOS da Dynamic Type nima

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 rivojlanish tarixi

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.

UIFont.TextStyle matn uslublari

iOS standart sozlama uchun har biri oldindan belgilangan o'lcham va shrift xususiyatiga ega 8 matn uslubini taqdim etadi:

UslubDoimiyO'lcham (L)Vazifa
Large Title.largeTitle34pxEkranning asosiy sarlavhasi
Title 1.title128pxBo'lim sarlavhasi
Title 2.title222pxOstsarlavha
Title 3.title320pxKarta sarlavhasi
Headline.headline17px (bold)Urg'u uchun qalin
Body.body17pxAsosiy matn
Callout.callout16pxYordamchi matn
Caption 1.caption112pxRasm ostidagi yozuv
Caption 2.caption211pxKichik yozuv
Footnote.footnote13pxIzoh, 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.

Uslublar orqali vizual ierarxiya

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.

Masshtablash darajalari

iOS ikki toifaga bo'lingan 11 daraja matn masshtablashni qo'llab-quvvatlaydi:

  • Standart o'lchamlar (5 daraja): XS, S, M, L (standart), XL
  • Foydalanish qulayligi o'lchamlari (6 daraja): accessibilityXL, accessibilityXXL, accessibilityXXXL, accessibilityXXXXL, accessibilityXXXXXL, accessibilityXXXXXXL

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:

swift
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
    // Muqobil tartibni yoqish
}

traitCollection va matn o'lchami

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 tatbiq etish

UIKit da asosiy tatbiq — UIFont.preferredFont(forTextStyle:). Bu usul joriy tizim sozlamasiga mos masshtablangan shriftni qaytaradi:

swift
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)

Maxsus shriftlar uchun UIFontMetrics dan foydalaning:

swift
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 va masshtablash egri chizig'i

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

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:

swift
Text("Asosiy matn")
    .font(.body)
    .lineLimit(nil)
    .minimumScaleFactor(0.5)

Maxsus masshtablar uchun DynamicTypeSize dan foydalaning:

swift
@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.

SwiftUI da Dynamic Type cheklovlari

.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.

Katta shriftlar uchun tartibni moslashtirish

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:

  • UIStackView distribution = fill va spacing = >= 8 bilan — elementlar keyingi qatorga ko'chiriladi
  • UITableViewCell automaticDimension bilan — hujayra balandligi tarkibga moslashadi
  • UILabel da numberOfLines = 0 — matn kesilmaydi, balki o'raladi
  • edgeInsets bilan tugmalar — foydalanish qulayligi darajalarida traitCollection.preferredContentSizeCategory orqali bo'shliqlar qo'shing

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:

swift
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)

Foydalanish qulayligi darajalarida odatiy tartib muammolari

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.

Dynamic Type ni sinash

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:

swift
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.

Accessibility Inspector: Dynamic Type ni tekshirish

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

Oddiy so'zlar bilan iOS da Dynamic Type nima?

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.

Dynamic Type faqat tizim shriftlari bilan ishlaydimi?

Yo'q. Maxsus shriftlar uchun UIFontMetrics(scaledFont:) dan foydalaning. Usul har qanday shriftni belgilangan matn uslubiga nisbatan masshtablaydi, nisbatlarni saqlaydi.

iOS nechta masshtablash darajasini qo'llab-quvvatlaydi?

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.

Matn o'lchami o'zgarishlariga qanday obuna bo'lish mumkin?

UIKit da UIContentSizeCategory.didChangeNotification orqali. SwiftUI da @Environment(\.dynamicTypeSize) dan foydalaning — tizim sozlamasi o'zgarganda ko'rinish avtomatik yangilanadi.

Dynamic Type ni qo'llab-quvvatlamasam nima bo'ladi?

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

  • Dynamic Type — matnni tizim sozlamalariga mos masshtablash uchun o'rnatilgan iOS mexanizmi; App Store uchun majburiy
  • Tizim shriftlari uchun UIFont.preferredFont(forTextStyle:) va maxsus shriftlar uchun UIFontMetrics dan foydalaning
  • iOS 11 daraja masshtablashni qo'llab-quvvatlaydi — XS dan AccessibilityXXXXXL gacha (body uchun 14–53px)
  • SwiftUI da Dynamic Type .font(.body) va @Environment(\.dynamicTypeSize) orqali avtomatik ishlaydi
  • Tartib moslashuvchan bo'lishi kerak: UIStackView, jadvallarda automaticDimension, numberOfLines = 0
  • Barcha 11 darajani, ayniqsa foydalanish qulayligi toifalarini sinab ko'ring — ularda tartiblarning 70% buziladi
  • UIKit ilovalari uchun UIContentSizeCategory.didChangeNotification ga obuna bo'lish majburiy

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.

Loyihani muhokama qilish

Shuningdek o'qing