Əsas məqamlar
Dynamic Type — sistem mətn ölçüsü dəyişdikdə tətbiq şriftlərinin avtomatik miqyaslanmasını təmin edən Apple texnologiyasıdır. İstifadəçi parametrlər → Əlçatanlıq → Ekran və mətn ölçüsü bölməsində istədiyi ölçünü seçir və Dynamic Type-i dəstəkləyən bütün tətbiqlər şrift ölçüsünü yenidən başlamadan uyğunlaşdırır.
Sistem 11 miqyaslandırma pilləsi təklif edir: XS (14pt əsas) ilə XXXL (23pt əsas) arasında, həmçinin görmə qüsuru olan istifadəçilər üçün 5 əlavə əlçatanlıq ölçüsü (AX1–AX5). Ölçü dəyişdikdə iOS UIContentSizeCategory.didChangeNotification bildirişi yaradır və tətbiq UIFontMetrics vasitəsilə şriftləri yenidən oxumalıdır. Apple Human Interface Guidelines-ə görə, Dynamic Type sətirarası intervalı və hərf nisbətlərini dəyişmir — yalnız şrift ölçüsünü dəyişir, bu da bütün ölçülərdə oxunaqlılığı qoruyur.
Dynamic Type əlçatan (accessibility) statusu üçün müraciət edən tətbiqlər üçün məcburidir. WWDC 2024-də Apple elan etdi ki, dinamik tip dəstəyi olmayan tətbiqlər, əsas funksionallığı mətn oxumaqla bağlıdırsa, rədd riski ilə üzləşir. IT Sectr layihələrində Dynamic Type-i ilk versiyadan tətbiq edirik — bu, sonradan əlçatanlığa uyğunlaşma üçün 20% vaxta qənaət edir.
Apple sistem şrifti SF Pro üçün UIFontDescriptor.UIAttributes-də göstərilən 11 əvvəlcədən təyin edilmiş mətn stili təqdim edir. Tərtibatçı piksel ölçüsünü təyin etmir — semantik stil seçir, iOS isə istifadəçinin parametrlərindən asılı olaraq müvafiq şrift ölçüsünü tətbiq edir.
| Stil | Ölçü (default) | Ölçü (AX5) | Təyinat |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Birinci səviyyə ekran başlıqları |
| .title1 | 28pt | 50pt | İkinci dərəcəli başlıqlar |
| .title2 | 22pt | 40pt | Bölmə başlıqları |
| .title3 | 20pt | 36pt | Alt başlıqlar |
| .headline | 17pt semibold | 31pt | Siyahılarda vurğulanmış mətn |
| .body | 17pt | 31pt | Əsas mətn |
| .callout | 16pt | 29pt | Qeydlər və əlavə mətn |
| .subheadline | 15pt | 27pt | Element izahları |
| .footnote | 13pt | 23pt | Qeydlər və kiçik mətn |
| .caption1 | 12pt | 21pt | Şəkil izahları |
| .caption2 | 11pt | 19pt | Etiketlər və kiçik izahlar |
Hər bir stil sabit xəttli (body üçün Regular, headline üçün Bold) sistem şrifti SF Pro-dan istifadə edir. Xüsusi şriftlər UIFontMetrics vasitəsilə qoşulur — xarici şrifti dinamik tipə uyğunlaşdırmağın yeganə düzgün yolu.
UIFontMetrics — iOS 11-də təqdim edilmiş, istənilən UIFont-u seçilmiş mətn stilinə nisbətən miqyaslandıran sinifdir. iOS 11-dən əvvəl tərtibatçılar yalnız sistem şrifti SF Pro-nu qaytaran preferredFontForTextStyle-dən istifadə edirdilər. UIFontMetrics bu problemi həll edir: istənilən şrifti qəbul edir və onun miqyaslandırılmış versiyasını qaytarır, xətt və nisbətləri qoruyur.
scaledFont(for:) metodu istifadəçinin cari mətn ölçüsünə əsasən miqyaslandırma əmsalını hesablayır: "Böyük" (Large) ölçüsü seçilərsə, əmsal 1.0; "Çox böyük" (AX1) — təxminən 1.3; "Maksimum" (AX5) — 1.8-ə qədər. Əmsal sistem şriftinə deyil, xüsusi şriftin əsas ölçüsünə tətbiq olunur — bu, dizaynerin fikrinin bütün ölçülərdə qorunmasını təmin edir.
UIFontMetrics tətbiqdəki bütün xüsusi şriftlər üçün istifadə edilməsi tövsiyə olunur. WWDC 2024-də Apple Dynamic Type dəstəyini yoxlayan və sabit ölçülü elementləri vurğulayan Accessibility Inspector alətini göstərdi. IT Sectr-də 2018-ci ildən bəri bütün layihələrdə UIFontMetrics tətbiq etdik — bu, üst-üstə düşən mətn səhvlərinin sayını 35% azaltdı.
Etiket üçün dinamik şrift əldə etməyin ən sadə yolu. Kod sistem mətn ölçüsünün dəyişməsinə avtomatik reaksiya verən .body stili ilə UILabel-in necə qurulduğunu göstərir.
import UIKit
class GreetingViewController: UIViewController {
private let label: UILabel = {
let l = UILabel()
l.text = "Hello, Dynamic Type!"
l.font = UIFont.preferredFont(forTextStyle: .body)
l.adjustsFontForContentSizeCategory = true
l.translatesAutoresizingMaskIntoConstraints = false
return l
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
}
}
adjustsFontForContentSizeCategory = true bayrağı sistem mətn ölçüsü dəyişdikdə şrifti avtomatik yeniləyir — bu bayraq olmadan Dynamic Type mövcud etiket üçün işləməyəcək. Ölçü dəyişdikdə iOS layoutIfNeeded çağırır və label əl ilə müdaxilə olmadan şrifti yeniləyir.
Xüsusi şrift (məsələn, Montserrat) istifadə edərkən preferredFontForTextStyle çağırışı sizin şriftinizi deyil, SF Pro-nu qaytaracaq. UIFontMetrics məhz xüsusi şrifti miqyaslandırır, onun dizaynını qoruyur.
import UIKit
extension UIFont {
static func customDynamicFont(name: String,
size: CGFloat,
style: UIFont.TextStyle) -> UIFont {
guard let baseFont = UIFont(name: name, size: size) else {
return .preferredFont(forTextStyle: style)
}
return UIFontMetrics(forTextStyle: style).scaledFont(for: baseFont)
}
}
let titleFont = UIFont.customDynamicFont(
name: "Montserrat-Bold",
size: 20,
style: .title3
)
scaledFont(for:) metodu əsas UIFont-u qəbul edir və .title3 stilinə nisbətən miqyaslandırılmış versiyanı qaytarır. AX5 əlçatanlıq ölçüsündə Montserrat-Bold 20pt şrifti ~36pt-ə çevrilir — bu stil üçün sistem şriftinin artdığı qədər. IT Sectr-də 2018-ci ildən bəri xüsusi şriftləri olan bütün layihələrdə bu nümunədən istifadə edirik ki, bu da görmə məhdudiyyəti olan istifadəçilərdən kiçik mətnlə bağlı şikayətləri tamamilə aradan qaldırdı.
Şrifti əl ilə yeniləyirsinizsə (adjustsFontForContentSizeCategory olmadan), UIContentSizeCategory.didChangeNotification bildirişinə abunə olun. Bu, avtomatik şrift yeniləməsini miras almayan xüsusi UI elementləri üçün lazımdır.
import UIKit
class DynamicLabel: UILabel {
private var customFont: UIFont?
private var textStyle: UIFont.TextStyle = .body
func configure(font: UIFont, style: UIFont.TextStyle) {
customFont = font
textStyle = style
NotificationCenter.default.addObserver(
self,
selector: #selector(updateFont),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
updateFont()
}
@objc private func updateFont() {
guard let base = customFont else { return }
self.font = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: base)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}
didChangeNotification-a abunə olmaq, xüsusi elementin tətbiqi yenidən başlatmadan sistem parametrlərinin istənilən dəyişməsində şrifti yeniləməsini təmin edir. iOS 15-dən etibarən bildiriş Live Text Size-i dəstəkləyən tətbiqlərdə Control Center vasitəsilə mətn ölçüsü dəyişdikdə belə gəlir.
Tez-tez verilən suallar
Dynamic Type iOS 7 və daha yeni versiyalarda mövcuddur. UIFontMetrics iOS 11-də ortaya çıxdı — ondan əvvəl birbaşa preferredFontForTextStyle metodundan istifadə olunurdu. iOS 15+-da dinamik tip böyük şriftlər üçün əlavə əlçatanlıq ölçülərini (AX1–AX5) dəstəkləyir. iOS 10 və daha köhnə versiyaları dəstəkləyən tətbiqlər UIFontMetrics olmadan preferredFontForTextStyle istifadə edir ki, bu da dəstəyi yalnız sistem şrifti SF Pro ilə məhdudlaşdırır.
Xcode 15+-da simulyatoru açın və Settings → Accessibility → Display & Text Size → Larger Text seçin. Ölçüsü dəyişmək üçün sürüşdürücünü dartın. Xcode-un özündə Debug → Accessibility Inspector var, o sabit şriftli elementləri vurğulayır. Avtomatlaşdırma üçün XCUITest vasitəsilə parametrlərin UISliderını dəyişən testdən istifadə edin — bu, bütün ekranların düzgün yenidən qurulmasını təmin edir.
Bəli, dinamik tipli Auto Layout UILabel və UIButton-da intrinsicContentSize istifadəsini tələb edir. Əlçatanlıq ölçülərində mətn superview-in hüdudlarından kənara çıxa bilər — UIScrollView əlavə edin və ya leading/trailing məhdudiyyətlərini artırın. Boşluqlar (padding) üçün UIFontMetrics.scaledValue istifadə edin ki, hərf arası intervallar da şriftə nisbətən miqyaslansın.
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