Dynamic Type: bu nima, iOS-da shriftlarni masshtablash

Muallif: IT Sectr Nashr etilgan: 2026-02-26 O'qish vaqti: 8 daq
Dynamic Type — iOS 7 versiyasidan boshlab operatsion tizimga o'rnatilgan avtomatik shrift masshtablash tizimi. Ruxsat etilgan matn o'lchamidan farqli o'laroq, Dynamic Type foydalanuvchi Settings → Display & Text Size bo'limida tanlagan tizimning qulaylik sozlamalariga mos ravishda shrift o'lchamini moslashtiradi. Apple Human Interface Guidelines (2025) ma'lumotlariga ko'ra, dinamik turni qo'llab-quvvatlash qulaylik sozlamalarida shrift o'lchamini o'zgartiradigan foydalanuvchilarning 32% uchun interfeysning o'qilishini oshiradi.

Asosiy nuqtalar

  • Dynamic Type — iOS 7 dan boshlab mavjud bo'lgan, shriftlarni foydalanuvchining tizim sozlamalariga mos ravishda avtomatik masshtablaydigan o'rnatilgan iOS tizimi.
  • UIFontMetrics (iOS 11+) — maxsus shriftlarni nisbatlarni saqlagan holda dinamik turga moslashtirish uchun asosiy API.
  • Matn stilistikasi — .largeTitle dan .caption2 gacha 11 oldindan belgilangan uslub, har biri ma'lum o'lcham va ko'rinishga ega.
  • Auto Layout intrinsicContentSize orqali shrift o'zgarishlariga to'g'ri javob beradi — layout avtomatik qayta hisoblanadi.
  • Dynamic Type App Review dan o'tish uchun majburiy va Apple tomonidan accessibility-compliance uchun tavsiya etiladi.

Dynamic Type nima?

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.

iOS matn uslublari: largeTitle dan caption2 gacha

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: maxsus shriftlarni moslashtirish

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.

Swift da kod misollari

Misol 1: preferredFontForTextStyle orqali tizim shrifti

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.

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

Misol 2: UIFontMetrics orqali maxsus shrift

Maxsus shriftdan (masalan, Montserrat) foydalanganda preferredFontForTextStyle chaqiruvi sizning shriftni emas, SF Pro ni qaytaradi. UIFontMetrics aynan maxsus shriftni masshtablab, uning dizaynini saqlaydi.

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

Misol 3: O'lcham o'zgarishiga obuna bo'lish

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.

swift
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 ning barcha versiyalarida ishlaydimi?

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 da Dynamic Type ni qanday test qilish mumkin?

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.

Layout ni Dynamic Type ga mos ravishda masshtablash kerakmi?

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

  • Dynamic Type — iOS da foydalanuvchining tizim qulaylik sozlamalariga javob beradigan avtomatik shrift masshtablash tizimi.
  • 11 matn uslubi (.largeTitle 34pt dan .caption2 11pt gacha) interfeysning barcha ssenariylarini qamrab oladi — sarlavhalardan tavsiflargacha.
  • UIFontMetrics (iOS 11+) — maxsus shriftlarni dinamik turga moslashtirish uchun yagona to'g'ri API.
  • adjustsFontForContentSizeCategory = true bayrog'i tizim o'lchami o'zgarganda UILabel va UIButton shriftini avtomatik yangilaydi.
  • UIContentSizeCategory.didChangeNotification ga obuna bo'lish standart yangilanishni meros qilib olmaydigan maxsus UI elementlari uchun zarur.
  • Dynamic Type Apple tavsiyasiga ko'ra matn funksiyasiga ega ilovalarda App Review dan o'tish uchun majburiydir.
  • Barcha loyihalarda UIFontMetrics.scaledFont(for:) dan foydalaning — bu barcha qulaylik o'lchamlarida dizayner shriftini saqlashning yagona usuli.

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