Font Descriptor: shrift deskriptorining asosiy tushunchalari va imkoniyatlari

Muallif: IT Sectr Nashr etilgan: 2026-07-23 O'qish vaqti: 9 daq

Font Descriptor — bu iOS-da UIFontDescriptor va macOS-da NSFontDescriptor obyekti bo‘lib, shriftning barcha metama’lumotlarini o‘z ichiga oladi: oila, shrift uslubi, o‘lcham, harflararo masofa, qatorlararo masofa va tipografik atributlar. Shriftni to‘g‘ridan-to‘g‘ri UIFont(name:size:) orqali yaratish o‘rniga, dasturchi kerakli xususiyatlarni deskriptor orqali tavsiflaydi va tizim mavjud shriftlardan eng yaxshi moslikni tanlaydi. Apple Developer Documentation ma’lumotlariga ko‘ra, UIFontDescriptor 20 dan ortiq shrift atributlarini qo‘llab-quvvatlaydi va iOS tipografiya freymvorklarining barchasida — UIKitdan Core Text va SwiftUigacha qo‘llaniladi.

Asosiy ma’lumotlar

  • Font Descriptor — oila, shrift uslubi, o‘lcham va tipografik atributlar haqida metama’lumotlarga ega shrift tavsiflovchi obyekti
  • Muayyan shrift nomini ko‘rsatmasdan UIFont yaratishga imkon beradi
  • Mavjud shriftning modifikatsiyasini qo‘llab-quvvatlaydi: o‘lcham, uslub, kerningni yangi obyekt yaratmasdan o‘zgartirish
  • UIKit, Core Text va SwiftUI da shrift qidirish va sozlash uchun ishlatiladi
  • Shrift mosligini ta’minlaydi — mavjud eng yaqin shrift uslubini avtomatik tanlash

Font Descriptor nima va nima uchun kerak

Font Descriptor — bu shriftning xususiyatlarini aniq shrift fayli sifatida emas, balki kalit-qiymat juftliklari to‘plami sifatida tavsiflovchi obyektdir. Shriftni nomi bilan yaratish o‘rniga, dasturchi oila, uslub, o‘lcham va ixtiyoriy atributlarni belgilaydi va tizim eng yaxshi moslikni tanlaydi. Bunday yondashuv adaptiv tipografiya uchun juda muhim: bir xil deskriptor mavjud shriftlar to‘plami farq qiladigan turli iOS versiyalarida ishlashi mumkin. iOS Human Interface Guidelines ga ko‘ra, deskriptorlar orqali shrift mosligi dinamik shriftlar bilan ishlashning tavsiya etilgan usulidir.

Font Descriptorsiz dasturchi har bir shriftning mavjudligini nomi bilan tekshirishi va qo‘lda zaxira variantlarini aniqlashi kerak edi. Deskriptor bu jarayonni avtomatlashtiradi: u shrift uslublarining moslik matritsasini o‘z ichiga oladi — oddiy, qalin, kursiv, qalin kursiv — va aniq moslik bo‘lmaganda eng yaqin mavjudini qaytaradi. Tizim mosligi Core Text darajasida ishlaydi va iOS va macOS da yagona NSFontDescriptor API orqali mavjud.

Deskriptorlar maxsus shriftlar uchun ham ishlatiladi — Info.plist orqali yuklangan yoki qo‘lda qo‘shilgan. Agar shrift tizimda ro‘yxatdan o‘tgan bo‘lsa, uning deskriptori tizim shrifti kabi yaratiladi. Platformalararo eslatma: deskriptor kontseptsiyasi Android da Typeface.Builder orqali ham mavjud, ammo iOS ning UIFontDescriptor orqali amalga oshirilishi sezilarli darajada ko‘proq atributlarni beradi — Android dagi 5 ga qarshi 20 dan ortiq.

Font Descriptorning asosiy xususiyatlari va atributlari

UIFontDescriptor [UIFontDescriptor.AttributeName: Any] turidagi fontAttributes lug‘atida guruhlangan atributlarni o‘z ichiga oladi. Asosiy atributlarga shrift oilasi (family), nomi (name), o‘lchami (size), uslubi (traits), transformatsiya matritsasi (matrix), optik o‘lcham (opticalSize) va matn stili (textStyle) kiradi. Apple WWDC 2019 Session 227 ga ko‘ra, matn stillaridan — Dynamic Type — foydalanish accessibility mos ilovalar uchun majburiydir.

Traits atributi — ramziy xususiyatlarni o‘z ichiga olgan lug‘at: qalinlik (UIFontWeightTrait), kursiv (UIFontSlantTrait), kenglik (UIFontWidthTrait) va boshqalar. Bu qiymatlar shrift moslashtiruvchisi tomonidan shrift uslubini tanlash uchun ishlatiladi. Masalan, 0.0 qiymatidagi UIFontWeightTrait — oddiy uslub, 0.3 — qalin. Tizim raqamli qiymatlarni avtomatik ravishda mavjud shrift variantlariga moslashtiradi.

Qo‘shimcha atributlarga OpenType xususiyatlari (ligaturalar, kerning, raqam nisbatlari) uchun featureSettings, foydalanuvchiga ko‘rsatish uchun visibleName, shriftning afin transformatsiyalari uchun matrix va zaxira shriftlarning kaskad ro‘yxatlari uchun cascadeList kiradi. Atributlarning to‘liq ro‘yxati iOS va macOS da tipografiyaning deyarli barcha stsenariylarini qamrab oladi.

AtributTurTavsif
UIFontDescriptorFamilyStringShrift oilasi (SF Pro, Helvetica Neue)
UIFontDescriptorNameStringShriftning to‘liq nomi (HelveticaNeue-Bold)
UIFontDescriptorSizeNSNumberPunktlarda shrift o‘lchami
UIFontDescriptorMatrixNSValueAfin transformatsiya matritsasi
UIFontDescriptorTraits[String: Any]Shrift uslubining ramziy xususiyatlari
UIFontDescriptorTextStyleStringDynamic Type stili (headline, body, caption)

Swift da Font Descriptor orqali UIFont yaratish

iOS da Font Descriptor bilan ishlashning asosiy usuli — deskriptorni yaratish va keyin UIFont ni generatsiya qilish. Bu aniq nomni bilmasdan ma’lum xususiyatlarga ega shrift olish kerak bo‘lganda afzal ko‘riladigan yondashuv. Jarayon ikki bosqichdan iborat: UIFontDescriptorni init orqali yaratish va deskriptorda font(withSize:) metodini chaqirish.

swift
import UIKit

// Oila uchun shrift deskriptorini yarating
let descriptor = UIFontDescriptor.init(
    fontAttributes: [
        .family: "SF Pro",
        .traits: [
            .weight: UIFont.Weight.bold
        ]
    ]
)

// Deskriptordan UIFont yarating
let font = descriptor.font(withSize: 17)

Bu yondashuv tizim joriy qurilmada SF Proning qalin uslubi uchun eng yaxshi moslikni tanlashini kafolatlaydi. Asosiy afzallik — kod iOS versiyasiga bog‘liq emas: iOS 13 da SF Pro, eski versiyalarda esa Helvetica Neue yoki standart tizim shrifti ishlatiladi.

Dinamik o‘lchamli shrift yaratish uchun matn stili va masshtabli init ishlatiladi. Dynamic Type o‘lchamni avtomatik ravishda foydalanuvchi sozlamalariga moslashtiradi:

swift
// Dynamic Type deskriptori
let bodyDescriptor = UIFontDescriptor
    .preferredFontDescriptor(withTextStyle: .body)

// Shriftni qalin qil
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])

// Dinamik o‘lchamni saqlab UIFont yarating
let boldBodyFont = UIFont(
    descriptor: boldDescriptor!,
    size: bodyDescriptor.pointSize
)

Muhim: withSymbolicTraits metodi ixtiyoriy deskriptor qaytaradi — so‘ralgan uslub mavjud bo‘lmasa, nil qaytariladi. Ishlatishdan oldin har doim opsionalni tekshiring.

Atributlarni qo‘shish va almashtirish orqali modifikatsiya

Font Descriptor o‘zgarmas modelni qo‘llab-quvvatlaydi — har bir modifikatsiya metodi o‘zgartirilgan atribut bilan yangi deskriptor qaytaradi. Bu qiymat semantikasiga mos keladi va kodni oldindan bashorat qilish mumkin qiladi: asl deskriptor hech qachon o‘zgarmaydi. Asosiy modifikatsiya metodlari: atributlarni qo‘shish uchun addingAttributes, uslubni o‘zgartirish uchun withFace, o‘lchamni o‘zgartirish uchun withSize, afin transformatsiya uchun withMatrix.

addingAttributes metodi — eng moslashuvchan. U atributlar lug‘atini qabul qiladi va yangi deskriptor qaytaradi. Kalitlar mos kelganda yangi qiymatlar eskilarini almashtiradi. Bu o‘zgartirishlarni birlashtirishga imkon beradi: og‘irlikni qo‘shish, o‘lchamni o‘zgartirish va ligaturalarni bitta chaqiruv bilan yoqish. Apple Technical Q&A QA1682 ga ko‘ra, addingAttributes kengaytma orqali ommaviy modifikatsiya uchun tavsiya etilgan usuldir.

Amaliy qo‘llanilishi: kod muharririda monospace matn uchun shrift yaratish. Dasturchi tizim monospace deskriptorini oladi, yupqa chiziqlar uchun kamaytirilgan og‘irlik qo‘shadi va featureSettings orqali harflararo masofani oshiradi. Bu alohida shrift yuklamasdan o‘qilishi osonroq kod beradi.

swift
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()

// Maxsus atributlarni qo‘shing
let customDescriptor = monoDescriptor.addingAttributes([
    .size: 14,
    .traits: [
        .weight: UIFont.Weight.medium
    ]
])

let monoFont = UIFont(
    descriptor: customDescriptor,
    size: 14
)

Cheklov: barcha atributlarni deskriptor yaratilgandan keyin o‘zgartirib bo‘lmaydi. Masalan, shrift oilasi (family) init vaqtida bir marta o‘rnatiladi. Agar oilani o‘zgartirish kerak bo‘lsa, yangi deskriptor yarating. Bu Core Text arxitekturasi bilan bog‘liq bo‘lib, unda deskriptor ma’lum bir shrift resursiga bog‘langan.

Shrift mosligi va tizim shriftlarini qidirish

Shrift mosligi — Font Descriptorning asosiy funksiyasi bo‘lib, o‘rnatilgan shriftlar orasidan so‘ralgan atributlarga eng yaxshi moslikni avtomatik tanlaydi. Jarayon uch bosqichni o‘z ichiga oladi: filtrlash (mos kelmaydigan shriftlarni chiqarib tashlash), tartiblash (moslik darajasiga qarab saralash) va tanlash (eng yaxshi natijani qaytarish). Moslik Core Text darajasida amalga oshiriladi — bu butun iOS tipografiyasi asosidagi freymvork.

Deskriptorga mos keladigan barcha shriftlarni qidirish uchun matchingFontDescriptors metodidan foydalaniladi. U tegishliligi bo‘yicha tartiblangan deskriptorlar massivini qaytaradi. Dasturchi aniq moslikni (birinchi element) tanlashi yoki maxsus mantiq uchun variantlarni ko‘rib chiqishi mumkin. Apple Font Handling Guide ga ko‘ra, bu ma’lum oila uchun mavjud shrift uslublari ro‘yxatini nom bilan sanab o‘tmasdan olishning yagona usulidir.

Foydalanish stsenariysi: matn sozlamalari interfeysida shrift tanlash. Foydalanuvchi oilani tanlaydi va ilova matchingFontDescriptors orqali barcha mavjud uslublarni oladi va ularni pickerda ko‘rsatadi. Mosliksiz, iOS versiyalari orasida o‘zgarib turadigan variantlar ro‘yxatini qattiq kodlash kerak bo‘lardi.

swift
let searchDescriptor = UIFontDescriptor.init(
    fontAttributes: [.family: "SF Mono"]
)

// Barcha mavjud uslublarni oling
let matchingDescriptors = searchDescriptor
    .matchingFontDescriptors(withMandatoryKeys: nil)

for descriptor in matchingDescriptors {
    print(descriptor.object(forKey: .visibleName) ?? "unnamed")
}

Mandatory keys — qidiruvni cheklovchi parametr. [.family] ko‘rsatilsa, moslik belgilangan oilaning barcha shriftlarini qaytaradi. [.family, .traits] ko‘rsatilsa — faqat oilaga ham, uslubga ham mos keladiganlari. Mandatory keys dan foydalanish shriftlar to‘plamini qidirishda moslikni tezlashtiradi.

Samaradorlik: moslik iOS da 0.5 dan 5 ms gacha davom etadigan sinxron operatsiyadir. Bitta qidiruv uchun bu sezilmaydi, ammo deskriptorlarni ommaviy ko‘rib chiqishda (masalan, 50+ shriftli pickerda) natijalarni keshlash tavsiya etiladi. Apple ekran yuklanganda moslikni bir marta bajarish va deskriptorlar massivini saqlashni tavsiya qiladi.

Core Text va CTFontDescriptor bilan integratsiya

Core Text — iOS va macOS da tipografiya bilan ishlash uchun past darajali C freymvorki. Uning UIFontDescriptor analogi — CTFontDescriptor Core Foundation darajasida bir xil imkoniyatlarni ta’minlaydi. CTFontDescriptor Core Text API da shriftlar yaratish, matnni o‘lchash va murakkab tipografiyani render qilish uchun ishlatiladi. UIFontDescriptor mohiyatan CTFontDescriptor ustidagi kengaytirilgan atributlar to‘plamiga ega Objective-C o‘ramidir.

UIFontDescriptor va CTFontDescriptor o‘rtasidagi Toll-free bridging deskriptorlarni UIKit va Core Text o‘rtasida konvertatsiyasiz uzatishga imkon beradi. Bu maxsus matn renderidan foydalanadigan ilovalar — masalan, TextKit asosidagi matn muharrirlari yoki sintaksis yoritgichli kod muharrirlari — uchun juda muhimdir. Misol: CTFontDescriptorCreateCopyWithAttribute qo‘shilgan atribut bilan deskriptorning nusxasini yaratadi — UIFontDescriptordagi addingAttributesning analogi.

CTFontDescriptordagi kCTFontURLAttribute kalit atributi shrift faylining URLini o‘z ichiga oladi. Bu shriftning tizim yoki maxsus ekanligini aniqlashga imkon beradi. Maxsus shriftlar uchun URL shrift fayliga (.ttf yoki .otf) olib boradi, tizim shriftlari uchun — tizim shrift katalogiga. Deskriptor orqali ma’lumotlar faqat o‘qish uchun mo‘ljallangan; URL orqali shrift faylini o‘zgartirish qo‘llab-quvvatlanmaydi.

Ilg‘or tipografiya — maxsus ligaturalar, kontekstli almashtirishlar, muqobil gliflar — uchun kCTFontFeatureSettingsAttribute kaliti bilan CTFontDescriptorCopyAttribute ishlatiladi. Bu atribut deskriptor orqali qo‘shilishi mumkin bo‘lgan OpenType xususiyatlari lug‘atlarining massivini o‘z ichiga oladi. Apple Core Text Programming Guide ga ko‘ra, UIFontDescriptor va Core Textning kombinatsiyasi ilova tipografiyasi ustidan to‘liq nazoratni beradi.

Tez-tez beriladigan savollar

Font Descriptor UIFontdan nimasi bilan farq qiladi?

UIFont — matnni render qiluvchi tayyor shrift. Font Descriptor — shrift tavsifi, UIFont yaratish mumkin bo‘lgan atributlar to‘plami. Bitta deskriptor turli o‘lchamdagi bir nechta UIFontlarni yaratishi mumkin.

Font Descriptorni maxsus shriftlar uchun ishlatish mumkinmi?

Ha. Agar shrift tizimda ro‘yxatdan o‘tgan bo‘lsa (Info.plist yoki Core Graphics orqali), uning deskriptori oila yoki nom bo‘yicha tizim shriftlari kabi yaratiladi. Moslik barcha ro‘yxatdan o‘tgan shriftlar uchun ishlaydi.

Deskriptordan shrift nomini qanday olish mumkin?

Ko‘rsatiladigan nom uchun descriptor.object(forKey: .visibleName) yoki PostScript nomi uchun descriptor.postscriptName dan foydalaning. PostScript nomi UIFont(name:size:) orqali shrift yaratishda ishlatiladi.

Font Descriptorda cascade list nima?

Cascade list — zaxira shriftlar sifatida xizmat qiladigan ichki joylashtirilgan deskriptorlar massividir. Agar asosiy shrift kerakli belgini o‘z ichiga olmasa, tizim cascade listdagi shriftlarni ketma-ket tekshiradi. Emoji va CJK belgilarini qo‘llab-quvvatlash uchun ishlatiladi.

Font Descriptor SwiftUI da ishlaydimi?

Ha. SwiftUI Font Descriptorni Font(descriptor:size:) orqali qo‘llab-quvvatlaydi. SwiftUI o‘rami UIFontDescriptorni qabul qiladi va deskriptorning barcha atributlarini — kerning, ligaturalar va uslubni saqlagan holda SwiftUI shriftini yaratadi.

Xulosa

  • Font Descriptor — oila, uslub, o‘lcham va tipografik xususiyatlar atributlariga ega shrift tavsiflovchi obyekti
  • Atributlar to‘plamidan avtomatik shrift mosligi bilan UIFont yaratishga imkon beradi
  • addingAttributes, withSize, withSymbolicTraits orqali o‘zgarmas modifikatsiyani qo‘llab-quvvatlaydi
  • matchingFontDescriptors shrift qidirish va tanlash uchun barcha mavjud uslublarni qaytaradi
  • UIFontDescriptor va CTFontDescriptor o‘rtasida toll-free bridging orqali Core Text bilan integratsiyalanadi
  • Afzal matn stillari va masshtablash orqali Dynamic Type ni qo‘llab-quvvatlaydi
  • Shrift mavjudligini tekshirmasdan barcha iOS versiyalarini qo‘llab-quvvatlovchi adaptiv tipografiya uchun tavsiya etiladi

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