Dynamic Type: əsas anlayışlar, mətn stilləri və iOS-da necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-05-16 Oxuma vaxtı: 9 dəq

Dynamic Type — iOS-un daxili funksiyasıdır, o, tətbiqdə şrift ölçüsünü istifadəçinin sistem parametrlərinə uyğun avtomatik dəyişdirir. İstifadəçi Tənzimləmələr → Ekran və parlaqlıq → Mətn ölçüsü bölməsində üstünlük verdiyi mətn ölçüsünü təyin edir və Dynamic Type-ı dəstəkləyən bütün tətbiqlər əlavə tədbirlər olmadan uyğunlaşır. Apple Human Interface Guidelines, 2024-a görə, Dynamic Type dəstəyi App Store-da dərc etmək üçün məcburi tələbdir, çünki bu, iOS platformasında əlçatanlığın əsas elementidir.

Başlıca

  • Dynamic Type — mətni sistem şrift ölçüsü parametrlərinə uyğun avtomatik miqyaslamaq üçün iOS mexanizmi
  • Dəstək mətn stilləri (UIFont.TextStyle) — body, headline, caption, title və digərləri vasitəsilə təmin edilir
  • Sistem XSmall-dan AccessibilityXXXL-ə qədər 11 səviyyə miqyaslama dəstəkləyir
  • Xüsusi şriftlər üçün UIFontMetrics metodundan istifadə olunur, istənilən şrifti body stilinə nisbətdə miqyaslayır
  • Düzən uyğunlaşan olmalıdır — UIStackView, Auto Layout və dinamik hücrə hünndürlüyü məcburidir

iOS-da Dynamic Type nədir

Dynamic Type — iOS 7-də ortaya çıxmış iOS texnologiyasıdır, tətbiqdə mətni avtomatik olaraq sistem şrift ölçüsü parametrlərinə uyğunlaşdırmağa imkan verir. İstifadəçi bütün tətbiqlərdə eyni anda şrifti böyüdə və ya kiçildə bilər — hər bir tətbiqin parametrlərini ayrıca dəyişməyə ehtiyac yoxdur.

Apple WWDC 2023, “Make Your App Visually Accessible”-a görə, iOS istifadəçilərinin 40%-dən çoxu şrift ölçüsünü standartdan dəyişir. 65+ yaş qrupu üçün bu göstərici 70%-ə çatır. Dynamic Type App Store əlçatanlıq sertifikasiyası üçün məcburi tələbdir. Dəstəyin olmaması tətbiqin baxışda rədd edilməsinə səbəbdir.

İş prinsipi: tətbiq UIFont(name:size:) əvəzinə UIFont.preferredFont(forTextStyle:) istifadə edir. iOS cari sistem parametrinə uyğun miqyaslanmış şrifti avtomatik qaytarır. Parametrlərdə ölçü dəyişdirildikdə iOS UIContentSizeCategory.didChangeNotification bildirişi yaradır — tətbiq düzəni yenidən hesablamalıdır.

Dynamic Type-ın inkişaf tarixi

Dynamic Type iOS 7-də “flat” dizaynla birlikdə ortaya çıxdı. iOS 10-da UIFontMetrics vasitəsilə xüsusi şriftlərə dəstək əlavə edildi. iOS 11 əlçatanlıq səviyyələrini (AccessibilityXXXL-ə qədər) təqdim etdi. iOS 15 SwiftUI-də avtomatik dəstəklə Dynamic Type əlavə etdi. Hər buraxılışla Apple tələbləri sərtləşdirir: iOS 17-dən başlayaraq, Dynamic Type dəstəyi olmayan tətbiqlər App Store Connect-ə yüklənərkən xəbərdarlıq alır.

UIFont.TextStyle mətn stilləri

iOS standart parametr üçün hər biri əvvəlcədən müəyyən edilmiş ölçü və şrift xüsusiyyətlərinə malik 8 mətn stili təqdim edir:

StilSabitÖlçü (L)Təyinat
Large Title.largeTitle34pxEkranın əsas başlığı
Title 1.title128pxBölmə başlığı
Title 2.title222pxAltbaşlıq
Title 3.title320pxKart başlığı
Headline.headline17px (bold)Vurğu üçün qalın
Body.body17pxƏsas mətn
Callout.callout16pxKöməkçi mətn
Caption 1.caption112pxŞəkil altı imza
Caption 2.caption211pxKiçik imza
Footnote.footnote13pxQeyd, əlavə

Düzgün stildən istifadə sadəcə “görünüş” deyil. AccessibilityXXXL rejimində UIFont.TextStyle.body 53px-ə çata bilər. Tətbiq body üçün sabit 17px şriftdən istifadə edərsə, şrifti böyüdən istifadəçilər üçün mətn oxunmaz olacaq.

Stillər vasitəsilə vizual iyerarxiya

Dynamic Type sadəcə miqyaslamır — vizual iyerarxiyanı qoruyur. Large Title həmişə Title 1-dən böyükdür, o da Body-dən böyükdür, miqyaslama səviyyəsindən asılı olmayaraq. Miqyaslama əmsalları fərqlidir: başlıqlar əsas mətndən daha aktiv miqyaslanır ki, iyerarxiya hətta əlçatanlıq səviyyələrində də qorunsun.

Miqyaslama səviyyələri

iOS iki kateqoriyaya bölünmüş 11 səviyyə mətn miqyaslaması dəstəkləyir:

  • Standart ölçülər (5 səviyyə): XS, S, M, L (standart), XL
  • Əlçatanlıq ölçüləri (6 səviyyə): accessibilityXL, accessibilityXXL, accessibilityXXXL, accessibilityXXXXL, accessibilityXXXXXL, accessibilityXXXXXXL

Body stili üçün XS və AccessibilityXXXL arasındakı fərq 14px-dən 53px-ə qədərdir — təxminən 4×. 17px üçün hazırlanmış düzən 53px-də tamamilə pozulur: mətn hüdudlardan çıxır, düymələr üst-üstə düşür, hücrələr bir-birinə girir.

Koddakı cari kateqoriyanı yoxlayın:

swift
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
    // Alternativ düzəni aktivləşdir
}

traitCollection və mətn ölçüsü

Mətn ölçüsü kateqoriyası traitCollection.uiContentSizeCategory vasitəsilə əldə edilir. Sistem parametri dəyişdirildikdə iOS bütün UIView-lərdə traitCollectionDidChange çağırır. Bu metoddan şriftləri yeniləmək və düzəni yenidən hesablamaq lazımdır. SwiftUI bunu avtomatik edir — UIKit əl ilə abunə tələb edir.

UICollectionView üçün UICollectionViewCompositionalLayout istifadə edin — o, sütunların sayını ekranın eninə və mətn ölçüsünə avtomatik uyğunlaşdırır. Əlçatanlıq səviyyələrində iki sütunlu düzəndən bir sütunluya keçin ki, mətn kəsilməsin və elementlər üst-üstə düşməsin. Şərti düzən istifadə edin: regular width üçün — iki sütun, compact və ya accessibility üçün — bir sütun.

UIKit-də tətbiqi

UIKit-də əsas tətbiq — UIFont.preferredFont(forTextStyle:). Bu metod cari sistem parametrinə uyğun miqyaslanmış şrifti qaytarır:

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

Xüsusi şriftlər üçün UIFontMetrics istifadə edin:

swift
let customFont = UIFont(name: "Montserrat-Regular", size: 16)!
titleLabel.font = UIFontMetrics(forTextStyle: .body)
    .scaledFont(for: customFont)

// Ölçü dəyişikliklərinə nəzarət
NotificationCenter.default.addObserver(
    self,
    selector: #selector(preferredContentSizeChanged),
    name: UIContentSizeCategory.didChangeNotification,
    object: nil
)

UILabel üçün Interface Builder-də şrifti mətn stili (Text Style) kimi təyin etmək və “Automatically Adjusts Font”-ı aktivləşdirmək kifayətdir. Xüsusi şriftlər üçün IB UIFontMetrics-i dəstəkləmir — yalnız kod vasitəsilə.

UIFontMetrics və miqyaslama əyrisi

UIFontMetrics preferredFont ilə eyni miqyaslama əyrisindən istifadə edir. fromTextStyle: .body, .headline və s. təyin edə bilərsiniz. Hər stilin öz miqyaslama əmsalı var. Body mülayim miqyaslanır, Large Title isə aqressiv. Xüsusi şriftiniz əsas mətn üçün istifadə olunursa, .body istifadə edin.

SwiftUI-də Dynamic Type

SwiftUI-də Dynamic Type dəstəyi standart olaraq daxil edilmişdir. Bütün sistem modifikatorları (.font(.body), .font(.title)) avtomatik miqyaslanır. Proqramçı UIFont.preferredFont çağırmalı deyil.

Nümunə:

swift
Text("Əsas mətn")
    .font(.body)
    .lineLimit(nil)
    .minimumScaleFactor(0.5)

Xüsusi miqyaslar üçün DynamicTypeSize istifadə edin:

swift
@Environment(\.dynamicTypeSize) var dynamicTypeSize

var body: some View {
    Text("Uyğunlaşan mətn")
        .font(.body)
        .padding(dynamicTypeSize <= .large ? 8 : 16)
}

SwiftUI sistem mətn ölçüsü dəyişdirildikdə görünüşü avtomatik yeniləyir — əlavə bildiriş abunələrinə ehtiyac yoxdur.

SwiftUI-də Dynamic Type-ın məhdudiyyətləri

.font(.body) modifikatoru yalnız sistem şrifti üçün işləyir. SwiftUI-də xüsusi şriftlər üçün altlıqda UIFontMetrics ilə Font.custom istifadə edin. iOS 16-dan başlayaraq, SwiftUI @Environment-də DynamicTypeSize-i dəstəkləyir, bu da boşluqları və düzəni uyğunlaşdırmağa imkan verir.

Böyük şriftlər üçün düzənin uyğunlaşdırılması

Auto Layout — Dynamic Type dəstəyinin məcburi şərtidir. Sabit enlər və hündürlüklər (>=, <=) əlçatanlıq ölçülərində pozulur. UILabel üçün intrinsicContentSize istifadə edin — o, cari şrift ölçüsü üçün hündürlüyü avtomatik hesablayır.

Uyğunlaşan düzən qaydaları:

  • UIStackView distribution = fill və spacing = >= 8 ilə — elementlər növbəti sətirə keçiriləcək
  • UITableViewCell automaticDimension ilə — hücrənin hündürləyü məzmuna uyğunlaşır
  • UILabel-də numberOfLines = 0 — mətn kəsilmir, sətirlərə ayrılır
  • edgeInsets ilə düymələr — əlçatanlıq səviyyələrində traitCollection.preferredContentSizeCategory vasitəsilə boşluqlar əlavə edin

Uzun mətnlər üçün (məsələn, məqalələr, istifadə şərtləri) UILabel-də minimumScaleFactor təyin edin — bu, Auto Layout məzmunu yerləşdirə bilmədikdə son çarə olaraq mətni kiçildir. 0.5 dəyəri şriftin üstünlük verilən ölçünün 50%-nə qədər kiçilə biləcəyi deməkdir.

Boşluqların ölçü kateqoriyasına uyğunlaşdırılması nümunəsi:

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)

Əlçatanlıq səviyyələrində tipik düzən problemləri

Mətnin kəsilməsi — numberOfLines = 1 və sabit eni olan UILabel AccessibilityXL-də mətni kəsir. Həll: numberOfLines = 0 və trailing constraint. Elementlərin üst-üstə düşməsi — sabit hündürlükdə olan düymələr bir-birinə girir. Həll: automatic spacing ilə UIStackView. Ekran hüdudlarından çıxma — Əlçatanlıq səviyyələrində ScrollView məcburidir.

Dynamic Type-ın sınaqdan keçirilməsi

Xcode simulyatoru mətn ölçüsünü dəyişməyə imkan verir: simulyator menyusunda Settings → Accessibility → Display & Text Size → Larger Text. Bütün 11 səviyyə arasında keçid edin və mətnin kɘsilmədiyini, düymələrin əlçatan olduğunu və düzənin pozulmadığını yoxlayın.

Avtomatlaşdırılmış sınaq üçün XCUIApplication-da contentSizeCategory parametrindən istifadə edin:

swift
func testAccessibilitySizes() {
    let app = XCUIApplication()
    app.launchArguments += [
        "-UIPreferredContentSizeCategoryName",
        "UICTContentSizeCategoryAccessibilityXXXL"
    ]
    app.launch()
    app.scrollViews.buttons["Göndər"].tap()
    XCTAssertTrue(app.staticTexts["Forma göndərildi"]
        .waitForExistence(timeout: 5))
}

XCUITest müxtəlif launchArguments ilə CI-da bütün miqyaslama səviyyələrini yoxlamağa imkan verir. Əlçatanlıq kateqoriyalarını ayrıca yoxlamağı unutmayın — onlar çox vaxt düzəni pozur. Apple-a görə, Dynamic Type səhvlərinin 70%-i məhz əlçatanlıq səviyyələrində aşkar edilir, çünki proqramçılar yalnız standart ölçüləri sınayırlar.

Accessibility Inspector: Dynamic Type-ın yoxlanılması

Xcode Accessibility Inspector seçilmiş elementin hansı şriftlərdən istifadə etdiyini göstərir — sabit və ya miqyaslanan. Element simulyatorda mətn ölçüsü dəyişikliyinə reaksiya vermirsə, deməli sabit şrift istifadə olunur. Onu UIFont.preferredFont və ya UIFontMetrics ilə əvəz edin.

Tez-tez verilən suallar

Sadə sözlərlə iOS-da Dynamic Type nədir?

Bu, tətbiqdə mətnin sistem ölçü parametrlərinə uyğun avtomatik miqyaslanmasıdır. İstifadəçi Tənzimləmələrdə ölçünü dəyişir — bütün dəstəkləyən tətbiqlər proqramçının iştirakı olmadan uyğunlaşır.

Dynamic Type yalnız sistem şriftləri ilə işləyir?

Xeyr. Xüsusi şriftlər üçün UIFontMetrics(scaledFont:) istifadə edin. Metod istənilən şrifti göstərilən mətn stilinə nisbətdə miqyaslayır, nisbətləri qoruyur.

iOS neçə miqyaslama səviyyəsi dəstəkləyir?

11 səviyyə: 5 standart (XS, S, M, L, XL) və 6 əlçatanlıq səviyyəsi (AccessibilityXL-dən AccessibilityXXXXXL-dək). Body şriftinin ölçüsü 14px-dən 53px-dək dəyişə bilər.

Mətn ölçüsü dəyişikliklərinə necə abunə olmaq olar?

UIKit-də UIContentSizeCategory.didChangeNotification vasitəsilə. SwiftUI-də @Environment(\.dynamicTypeSize) istifadə edin — sistem parametri dəyişdirildikdə görünüş avtomatik yenilənəcək.

Dynamic Type-ı dəstəkləməsəm nə olar?

Böyüdülmüş şrifti olan istifadəçilər kɘsilmiş mətn, üst-üstə düşən elementlər və işləməyən düymələr görəcək. Tətbiq əlçatanlıq tələblərinin pozulmasına görə App Store baxışında rədd edilə bilər.

Nəticə

  • Dynamic Type — mətni sistem parametrlərinə uyğun miqyaslamaq üçün daxili iOS mexanizmi; App Store üçün məcburidir
  • Sistem şriftləri üçün UIFont.preferredFont(forTextStyle:) və xüsusi şriftlər üçün UIFontMetrics istifadə edin
  • iOS 11 səviyyə miqyaslama dəstəkləyir — XS-dən AccessibilityXXXXXL-dək (body üçün 14–53px)
  • SwiftUI-də Dynamic Type .font(.body) və @Environment(\.dynamicTypeSize) vasitəsilə avtomatik işləyir
  • Düzən uyğunlaşan olmalıdır: UIStackView, cədvəllərdə automaticDimension, numberOfLines = 0
  • Bütün 11 səviyyəni, xüsusən əlçatanlıq kateqoriyalarını sınayın — onlarda düzənlərin 70%-i pozulur
  • UIKit tətbiqləri üçün UIContentSizeCategory.didChangeNotification abunəsi məcburidir

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun