Asosiy nuqtalar
Dynamic Type — tizim matn o'lchami o'zgarganda ilova shriftlari avtomatik masshtablanadigan Apple texnologiyasidir. Foydalanuvchi Settings → Accessibility → Display & Text Size da kerakli o'lchamni belgilaydi va Dynamic Type ni qo'llab-quvvatlaydigan barcha ilovalar shrift o'lchamini qayta ishga tushirmasdan moslashtiradi.
Tizim 11 masshtablash darajasini taklif qiladi: XS (14pt asosiy) dan XXXL (23pt asosiy) gacha, shuningdek ko'rish qobiliyati zaif foydalanuvchilar uchun 5 ta qo'shimcha qulaylik o'lchami (AX1–AX5). O'lcham o'zgarganda iOS UIContentSizeCategory.didChangeNotification xabarnomasini yaratadi va ilova UIFontMetrics orqali shriftlarni qayta o'qishi kerak. Apple Human Interface Guidelines ga ko'ra, Dynamic Type qator oralig'i va harf nisbatlarini o'zgartirmaydi — faqat shrift o'lchamini o'zgartiradi, bu esa barcha o'lchamlarda o'qilishni saqlaydi.
Dynamic Type qulay (accessibility) maqomiga da'vogar ilovalar uchun majburiydir. WWDC 2024 da Apple dinamik turni qo'llab-quvvatlamaydigan ilovalar, agar ularning asosiy funksiyasi matn o'qish bilan bog'liq bo'lsa, rad etilish xavfi borligini e'lon qildi. IT Sectr loyihalarida Dynamic Type ni birinchi versiyadan joriy qilamiz — bu keyinchalik qulaylikka moslashtirish uchun 20% vaqtni tejaydi.
Apple tizim shrifti SF Pro uchun UIFontDescriptor.UIAttributes da ko'rsatiladigan 11 oldindan belgilangan matn uslubini taqdim etadi. Dasturchi piksel o'lchamini belgilamaydi — semantik uslubni tanlaydi, iOS esa foydalanuvchi sozlamalariga qarab tegishli shrift o'lchamini qo'llaydi.
| Uslub | O'lcham (standart) | O'lcham (AX5) | Vazifasi |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Birinchi darajali ekran sarlavhalari |
| .title1 | 28pt | 50pt | Ikkinchi darajali sarlavhalar |
| .title2 | 22pt | 40pt | Bo'lim sarlavhalari |
| .title3 | 20pt | 36pt | Pastki sarlavhalar |
| .headline | 17pt semibold | 31pt | Ro'yxatlarda ajratilgan matn |
| .body | 17pt | 31pt | Asosiy matn |
| .callout | 16pt | 29pt | Izohlar va qo'shimcha matn |
| .subheadline | 15pt | 27pt | Element tavsiflari |
| .footnote | 13pt | 23pt | Izohlar va kichik matn |
| .caption1 | 12pt | 21pt | Rasm tavsiflari |
| .caption2 | 11pt | 19pt | Yorliqlar va kichik tavsiflar |
Har bir uslub doimiy ko'rinishga ega (body uchun Regular, headline uchun Bold) tizim shrifti SF Pro dan foydalanadi. Maxsus shriftlar UIFontMetrics orqali ulanadi — uchinchi tomon shriftini dinamik turga moslashtirishning yagona to'g'ri usuli.
UIFontMetrics — iOS 11 da joriy qilingan, istalgan UIFont ni tanlangan matn uslubiga mutanosib ravishda masshtablaydigan sinf. iOS 11 dan oldin dasturchilar faqat tizim shrifti SF Pro ni qaytaradigan preferredFontForTextStyle dan to'g'ridan-to'g'ri foydalanishgan. UIFontMetrics bu muammoni hal qiladi: istalgan shriftni qabul qiladi va uning masshtablangan versiyasini qaytaradi, ko'rinish va nisbatlarni saqlaydi.
scaledFont(for:) metodi foydalanuvchining joriy matn o'lchamiga asoslanib masshtablash koeffitsiyentini hisoblaydi: agar "Katta" (Large) o'lcham tanlansa, koeffitsiyent 1.0; "Juda katta" (AX1) — taxminan 1.3; "Maksimal" (AX5) — 1.8 gacha. Koeffitsiyent tizim shriftiga emas, balki maxsus shriftning asosiy o'lchamiga qo'llaniladi — bu dizaynerning fikri barcha o'lchamlarda saqlanishini kafolatlaydi.
UIFontMetrics ilovadagi barcha maxsus shriftlar uchun tavsiya etiladi. WWDC 2024 da Apple Dynamic Type qo'llab-quvvatlashni tekshiradigan va UIFontMetrics o'rniga doimiy o'lchamdan foydalanadigan elementlarni ajratib ko'rsatadigan Accessibility Inspector vositasini ko'rsatdi. IT Sectr da 2018 yildan beri barcha loyihalarda UIFontMetrics ni joriy qildik — bu matnning bir-biriga chiqishi bilan bog'liq xatolar sonini 35% ga kamaytirdi.
Yorliq uchun dinamik shrift olishning eng oddiy usuli. Kod tizim matn o'lchamining o'zgarishiga avtomatik javob beradigan .body uslubi bilan UILabel ni qanday sozlashni ko'rsatadi.
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 bayrog'i tizim matn o'lchami o'zgarganda shriftni avtomatik yangilaydi — bu bayroqsiz Dynamic Type mavjud yorliq uchun ishlamaydi. O'lcham o'zgarganda iOS layoutIfNeeded ni chaqiradi va label qo'lda aralashuvsiz shriftni yangilaydi.
Maxsus shriftdan (masalan, Montserrat) foydalanganda preferredFontForTextStyle chaqiruvi sizning shriftni emas, SF Pro ni qaytaradi. UIFontMetrics aynan maxsus shriftni masshtablab, uning dizaynini saqlaydi.
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:) metodi asosiy UIFont ni qabul qiladi va .title3 uslubiga mutanosib masshtablangan versiyani qaytaradi. AX5 qulaylik o'lchamida Montserrat-Bold 20pt shrifti ~36pt ga aylanadi — aynan shu uslubdagi tizim shrifti qancha kattalashgan bo'lsa. IT Sectr da 2018 yildan beri maxsus shriftli barcha loyihalarda ushbu naqshdan foydalanamiz, bu ko'rish qobiliyati cheklangan foydalanuvchilardan kichik matn haqidagi shikoyatlarni butunlay bartaraf etdi.
Agar shriftni qo'lda yangilasangiz (adjustsFontForContentSizeCategory siz), UIContentSizeCategory.didChangeNotification xabarnomasiga obuna bo'ling. Bu avtomatik shrift yangilanishini meros qilib olmaydigan maxsus UI elementlari uchun zarur.
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 ga obuna bo'lish maxsus elementning ilovani qayta ishga tushirmasdan tizim sozlamalarining har qanday o'zgarishida shriftni yangilashini kafolatlaydi. iOS 15 dan boshlab xabarnoma Live Text Size ni qo'llab-quvvatlaydigan ilovalarda Control Center orqali matn o'lchami o'zgarganda ham keladi.
Tez-tez beriladigan savollar
Dynamic Type iOS 7 va undan yangi versiyalarda mavjud. UIFontMetrics iOS 11 da paydo bo'ldi — undan oldin to'g'ridan-to'g'ri preferredFontForTextStyle metodidan foydalanilgan. iOS 15+ da dinamik tur katta shriftlar uchun qo'shimcha qulaylik o'lchamlarini (AX1–AX5) qo'llab-quvvatlaydi. iOS 10 va undan eski versiyalarni qo'llab-quvvatlaydigan ilovalar UIFontMetrics siz preferredFontForTextStyle dan foydalanadi, bu esa qo'llab-quvvatlashni faqat tizim shrifti SF Pro bilan cheklaydi.
Xcode 15+ da simulyatorni oching va Settings → Accessibility → Display & Text Size → Larger Text ni tanlang. O'lchamni o'zgartirish uchun slayderni torting. Xcode ning o'zida Debug → Accessibility Inspector mavjud bo'lib, u doimiy shriftli elementlarni ajratib ko'rsatadi. Avtomatlashtirish uchun XCUITest orqali sozlamalarning UISlider ini o'zgartiradigan testdan foydalaning — bu barcha ekranlarning to'g'ri qayta qurilishini kafolatlaydi.
Ha, dinamik turdagi Auto Layout UILabel va UIButton da intrinsicContentSize dan foydalanishni talab qiladi. Qulaylik o'lchamlarida matn superview chegarasidan chiqib ketishi mumkin — UIScrollView qo'shing yoki leading/trailing cheklovlarini oshiring. Bo'shliqlar (padding) uchun UIFontMetrics.scaledValue dan foydalaning, shunda harflar orasidagi intervallar ham shriftga mutanosib ravishda masshtablansin.
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.