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 — 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 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.
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:
| Stil | Sabit | Ölçü (L) | Təyinat |
|---|---|---|---|
| Large Title | .largeTitle | 34px | Ekranın əsas başlığı |
| Title 1 | .title1 | 28px | Bölmə başlığı |
| Title 2 | .title2 | 22px | Altbaşlıq |
| Title 3 | .title3 | 20px | Kart başlığı |
| Headline | .headline | 17px (bold) | Vurğu üçün qalın |
| Body | .body | 17px | Əsas mətn |
| Callout | .callout | 16px | Köməkçi mətn |
| Caption 1 | .caption1 | 12px | Şəkil altı imza |
| Caption 2 | .caption2 | 11px | Kiçik imza |
| Footnote | .footnote | 13px | Qeyd, ə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.
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.
iOS iki kateqoriyaya bölünmüş 11 səviyyə mətn miqyaslaması dəstəkləyir:
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:
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
// Alternativ düzəni aktivləşdir
}
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ə əsas tətbiq — UIFont.preferredFont(forTextStyle:). Bu metod cari sistem parametrinə uyğun miqyaslanmış şrifti qaytarır:
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)
Xüsusi şriftlər üçün UIFontMetrics istifadə edin:
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 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 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ə:
Text("Əsas mətn")
.font(.body)
.lineLimit(nil)
.minimumScaleFactor(0.5)
Xüsusi miqyaslar üçün DynamicTypeSize istifadə edin:
@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.
.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.
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ı:
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:
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)
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.
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:
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.
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
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.
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.
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.
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.
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ə
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.
Həm də oxuyun