UIFont va CTFont — bu iOS-da shriftlar bilan ishlash uchun sinflar: UILabel va UITextView-da matnni yuqori darajada sozlash uchun UIKit-dan UIFont, gliflar va metrikalar ustidan to‘liq nazorat bilan past darajadagi renderlash uchun Core Text-dan CTFont. Apple Developer Documentation ma’lumotlariga ko‘ra, UIFont standart UI komponentlarining 90% ida ishlatiladi, CTFont esa maxsus matn dvigatellari va muharrirlarida qo‘llaniladi. Ikkala sinf bir shriftni, ammo turli abstraksiya darajasida ifodalaydi.
Asosiy maqamlar
UIFont — UI komponentlarida matnni ko‘rsatish uchun shriftni ifodalovchi UIKit sinfi: UILabel, UITextView, UITextField. U o‘lcham, og‘irlik va uslubni ko‘rsatgan holda tizim va maxsus shriftlarni olish uchun oddiy interfeysni ta’minlaydi. UIFont kerning, ligatura va OpenType xususiyatlarini bevosita boshqarishga ruxsat bermaydi — buning uchun Core Text ishlatiladi.
CTFont — shrift ma’lumotlariga past darajadagi kirishni ta’minlovchi Core Text turi (CTFontRef). CTFont bevosita Core Graphics bilan ishlaydi, renderlash uchun muqobil gliflar, ligaturalar va o‘zgaruvchan shriftlarni o‘z ichiga olgan barcha OpenType va TrueType imkoniyatlarini qo‘llab-quvvatlaydi. CTFont UIFont-ni ko‘rsatish uchun UIKit ichida ishlatiladi, lekin maxsus chizish uchun ham bevosita mavjud.
UIFont va CTFont toll-free bridging — qo‘shimcha xarajatlarsiz turlar o‘rtasida konvertatsiyani qo‘llab-quvvatlaydi. Swift va Objective-C da UIFont as CTFont yoki CTFont as UIFont cast qilish mumkin. Bu shrift ma’lumotlarini nusxalamasdan sozlash uchun yuqori darajadagi UIKit API va renderlash uchun past darajadagi Core Text dan foydalanishga imkon beradi.
Ikkala sinf shrift xususiyatlarini tavsiflash uchun UIFontDescriptor (UIKit) / CTFontDescriptor (Core Text) dan foydalanadi: nom, o‘lcham, og‘irlik, uslub, transformatsiya matritsasi. Deskriptor — bu o‘zgartirilishi va mavjud shriftlar asosida yangi shriftlar yaratilishi mumkin bo‘lgan atributlar lug‘ati. Masalan, deskriptorga traitItalic qo‘shib, xuddi shu shriftning kursiv versiyasini olish.
UIFont shriftlar yaratish uchun bir nechta fabrik metodlarni taqdim etadi. systemFont(ofSize:) San Francisco (iOS) yoki Helvetica (eski versiyalar) tizim shriftini qaytaradi. boldSystemFont, italicSystemFont — shrift uslubidagi variantlar. preferredFont(forTextStyle:) berilgan uslub uchun Dynamic Type shriftini qaytaradi: .headline, .body, .caption1, .footnote. Ushbu shriftlar tizimdagi matn o‘lchami sozlamalari o‘zgarganda avtomatik ravishda masshtablanadi.
Maxsus shriftlarni yuklash uchun shriftning PostScript nomi bilan UIFont(name:size:) ishlatiladi. Shrift oldindan Info.plist ga qo‘shilgan va ilova bundle-iga kiritilgan bo‘lishi kerak. Apple ma’lumotlariga ko‘ra, barcha standart UI komponentlari uchun UIFont dan foydalanish va faqat maxsus renderlash zarur bo‘lganda CTFont ga o‘tish tavsiya etiladi.
Dynamic Type — iOS 7 da joriy qilingan moslashuvchan shriftlar tizimi. Foydalanuvchi Sozlamalarda afzal ko‘rgan matn o‘lchamini tanlaydi — juda kichikdan juda kattagacha. UIFont.preferredFont avtomatik ravishda tegishli o‘lchamdagi shriftni qaytaradi. To‘g‘ri ishlashi uchun barcha UILabel lar adjustsFontForContentSizeCategory = true ga ega bo‘lishi kerak. Dynamic Type foydalanish imkoniyati muvofiqligi uchun majburiydir.
UIFontDescriptor noldan yangi namuna yaratmasdan shrift atributlarini o‘zgartirishga imkon beradi. addingAttributes(_:), withSymbolicTraits(_:), withFamily(_:) metodlari o‘zgartirilgan parametrlar bilan yangi deskriptorni qaytaradi. Bu shrift variantlarini olish uchun qulay: tizim shriftiga traitBold qo‘shib, PostScript nomini bilmasdan qalin versiyani olish.
CTFont (CTFontRef) — shriftlar bilan past darajadagi ishlash uchun Core Text turi. U CTFontCreateWithName, CTFontCreateWithFontDescriptor, CTFontCreateCopyWithAttributes funksiyalari bilan yaratiladi. Har bir funksiya belgilangan interfeys, o‘lcham va ixtiyoriy atributlar bilan shriftni qaytaradi. CTFont Core Graphics da maxsus UIView larda drawRect orqali matn renderlash uchun ishlatiladi.
CTFont UIFont da mavjud bo‘lmagan metrikalarga kirishni ta’minlaydi: CTFontGetGlyphsForCharacters berilgan belgilar uchun gliflar massivini qaytaradi, CTFontGetAdvancesForGlyphs — har bir glifning kengligi, CTFontGetBoundingBox — glif chegaralari. Bu maxsus matn layout larini qurish uchun zarur: ustunlar, aylantirish, oqim.
CTFontGetAscent, CTFontGetDescent, CTFontGetLeading shriftning vertikal metrikalarini qaytaradi. CTFontGetUnitsPerEm — em-square dagi birliklar soni, nisbatlarni hisoblash uchun ishlatiladi. CTFontGetGlyphCount — shriftdagi gliflarning umumiy soni. Bu ma’lumotlar poligrafik tipografiya va har bir belgining aniq joylashuvi talab qilinadigan maxsus sahifalash uchun muhimdir.
CTFont OpenType xususiyatlarini qo‘llab-quvvatlaydi: CTFontCopyFeatures shriftning mavjud funksiyalari lug‘atini qaytaradi (ligaturalar, muqobil belgilar, kerning), CTFontEnableFeature ma’lum bir variantni faollashtiradi. O‘zgaruvchan shriftlar (Variable Fonts) CTFontCopyVariation va CTFontCreateCopyWithVariation orqali sozlanadi, weight, width va slant ni uzluksiz diapazonda o‘zgartirishga imkon beradi.
Swift da UIFont yaratish fabrik metodlardan biri yoki nom bo‘yicha to‘g‘ridan-to‘g‘ri inicializatsiya orqali amalga oshiriladi. Eng keng tarqalgan usul — tizim shriftlari uchun systemFont(ofSize:weight:) yoki Dynamic Type uchun preferredFont(forTextStyle:). Maxsus shriftlar uchun PostScript nomi bilan UIFont(name:size:) ishlatiladi.
UIFont.systemFont(ofSize:weight:) UIFont.Weight ni qabul qiladi — .ultraLight dan .black gacha. Bu usul tegishli og‘irlik bilan San Francisco tizim shriftini qaytaradi. UIFont.monospacedSystemFont, UIFont.monospacedDigitSystemFont kod va raqamlar uchun monoshirin shriftlarni qaytaradi. Barcha tizim shriftlari avtomatik ravishda Dynamic Type ni qo‘llab-quvvatlaydi.
let regularFont = UIFont.systemFont(ofSize: 16, weight: .regular)
let boldFont = UIFont.systemFont(ofSize: 16, weight: .bold)
let headlineFont = UIFont.preferredFont(forTextStyle: .headline)
let monoFont = UIFont.monospacedSystemFont(ofSize: 14, weight: .regular)
label.font = headlineFont
Har bir shrift to‘g‘ridan-to‘g‘ri UILabel ning font xususiyatiga tayinlanishi yoki NSFontAttributeName orqali NSAttributedString da ishlatilishi mumkin. Tizim shriftlari iOS tomonidan keshlanadi, shuning uchun tizim shriftini qayta yaratish qo‘shimcha xarajat keltirmaydi.
Maxsus shriftdan foydalanish uchun TTF yoki OTF faylini loyiha bundle-iga qo‘shing va uni Info.plist da (UIAppFonts) belgilang. Shriftning PostScript nomini UIFont.familyNames va UIFont.fontNames(forFamilyName:) orqali bilish mumkin. Ro‘yxatdan o‘tgandan so‘ng, shrift ilovaning istalgan nuqtasida UIFont(name:size:) orqali mavjud bo‘ladi.
// Barcha shrift oila nomlarini oling
for family in UIFont.familyNames {
let names = UIFont.fontNames(forFamilyName: family)
print("\(oila): \(nomlar)")
}
// Maxsus shriftni yuklang
if let customFont = UIFont(name: "MyCustomFont-Regular", size: 18) {
label.font = customFont
}
Agar shrift nomi noto‘g‘ri bo‘lsa, UIFont(name:size:) nil qaytaradi. Shriftning to‘g‘ri ro‘yxatdan o‘tganligiga ishonch hosil qilish uchun disk raskadrovka vaqtida UIFont.familyNames va UIFont.fontNames(forFamilyName:) orqali barcha mavjud nomlarni chop etish tavsiya etiladi.
Maxsus shriftlarni yuklash ikki usulda mumkin: Info.plist (UIAppFonts) orqali statik ro‘yxatdan o‘tkazish va CTFontManagerRegisterGraphicsFont orqali dinamik ro‘yxatdan o‘tkazish. Birinchi usul soddaroq — shrift ilova ishga tushgandan so‘ng darhol mavjud. Ikkinchisi tarmoqdan yuklanadigan yoki talab bo‘yicha yuklab olinadigan shriftlar uchun ishlatiladi.
Dinamik ro‘yxatdan o‘tkazish talab bo‘yicha resurslar uchun foydali: agar ilova 20+ shriftni o‘z ichiga olsa, ularning barchasini boshlang‘ich bundle-ga kiritish shart emas, balki birinchi foydalanishda yuklab olish mumkin. CTFontManagerRegisterFontsForURLs ko‘rsatilgan URL lardan shriftlarni ro‘yxatdan o‘tkazadi. Ro‘yxatdan o‘tgandan so‘ng, shrift odatdagidek UIFont(name:size:) orqali mavjud bo‘ladi.
Core Text orqali maxsus renderlash uchun shriftning PostScript nomi bilan CTFontCreateWithName dan foydalaning. UIFont dan farqi shundaki, CTFont transformatsiya matritsasi bilan yaratilishi mumkin (CTFontCreateWithNameAndOptions) — buzilgan shriftlar yaratish uchun: egish, X o‘qi bo‘yicha masshtablash, aylantirish. Bu affin transformatsiyalaridan foydalanmasdan UIFont da mavjud emas.
// CTFont ni qiyalik matritsasi bilan yarating
var matrix = CGAffineTransform(a: 1, b: 0, c: 0.2, d: 1, tx: 0, ty: 0)
let ctFont = CTFontCreateWithName(
"Helvetica" as CFString,
24, &matrix)
// UIFont bilan toll-free bridging dan foydalaning
let uiFont = ctFont as UIFont
label.font = uiFont
Transformatsiya matritsasi alohida shrift faylisiz italic variantlarini yaratishga imkon beradi. c parametri (skew) belgilarga qiyalik qo‘shadi. Matritsa shuningdek shriftni gorizontal masshtablashga imkon beradi — bir shriftning siqilgan yoki kengaytirilgan variantlarini yaratish.
UIFont va CTFont o‘rtasidagi asosiy farq — abstraksiya darajasi. UIFont keng tarqalgan vazifalar uchun oddiy API ni ta’minlaydi: tizim shriftini olish, o‘lchamini o‘zgartirish, UILabel ga qo‘llash. CTFont shrift ustidan to‘liq nazoratni beradi: gliflar, metrikalar, OpenType jadvallari va o‘zgaruvchan o‘qlarga kirish. Tanlov vazifaga bog‘liq.
| Xususiyat | UIFont | CTFont |
|---|---|---|
| Framework | UIKit | Core Text |
| Yaratish | systemFont / preferredFont / initWithName | CTFontCreateWithName / CTFontCreateWithDescriptor |
| Gliflarga kirish | Yo‘q | CTFontGetGlyphsForCharacters |
| OpenType xususiyatlari | Cheklangan (UIFontDescriptor) | To‘liq kirish |
| O‘zgaruvchan shriftlar | UIFontDescriptor orqali | CTFontCopyVariation / CreateCopyWithVariation |
| Renderlash | UI komponentlarida avtomatik | Core Graphics, maxsus |
iOS dasturlash vazifalarining 95% uchun UIFont yetarli. Core Text CTFont bilan matn muharrirlari, PDF generatorlari, tipografik sahifalashli kitoblar yoki nodir tillarning maxsus ko‘rinishiga ega ilovalarni yaratishda o‘zini oqlaydi.
iOS da shriftlar bilan ishlash ishlashni hisobga olishni talab qiladi. Har bir noyob shrift birinchi foydalanishda xotiraga yuklanadi va resurslarni egallaydi. San Francisco tizim shriftlari oldindan yuklangan va qo‘shimcha xarajat yaratmaydi. Maxsus shriftlar fayldan yuklanadi va birinchi yuklashdan keyin tizim tomonidan keshlanadi.
Ilovada noyob shriftlar sonini 3-5 oila bilan cheklash tavsiya etiladi. Har bir shrift xotirada 50 KB dan 2 MB gacha joy egallaydi. Bir oilaning turli og‘irliklaridan (regular, bold, medium) foydalanish bir nechta turli oilalarni yuklashdan ko‘ra samaraliroqdir.
Tizim yaratilgan UIFont namunalarini keshlaydi, shuning uchun UIFont.systemFont(ofSize: 16, weight: .regular) takroriy chaqiruvlari yangi ob’ekt yaratmaydi. Biroq, UIFont(name:size:) maxsus shriftlar uchun har doim keshlanmaydi — tez-tez ishlatiladigan shriftlarni statik xususiyatlarda yoki NSCache keshida saqlash tavsiya etiladi, bu fayldan qayta yuklashning oldini oladi.
CTFontManagerRegisterGraphicsFont orqali dinamik ro‘yxatdan o‘tkazishda, agar shrift fayli tarmoqdan yuklab olinsa, jarayon asinxron bo‘lishi mumkin. Bu holda, UILabel yoki UITextView yuklash tugaguncha zaxira tizim shriftini ko‘rsatishi kerak. Ro‘yxatdan o‘tgandan so‘ng, shrift mavjud bo‘ladi va ekran avtomatik ravishda matn ko‘rinishini yangilaydi.
Tez-tez beriladigan savollar
Ha, UIFont va CTFont toll-free bridging ni qo‘llab-quvvatlaydi. Konvertatsiya oddiy cast orqali amalga oshiriladi: UIFont as CTFont yoki CTFont as UIFont. Hech qanday qo‘shimcha xarajat yoki ma’lumotlarni nusxalash bo‘lmaydi — ikkala sinf xotiradagi bir shrift ob’ektiga ishora qiladi.
Barcha UI komponentlari uchun UIFont dan foydalaning. U UIKit uchun optimallashtirilgan, Dynamic Type ni qo‘llab-quvvatlaydi, tizim sozlamalari o‘zgarganda to‘g‘ri masshtablanadi. CTFont faqat Core Graphics orqali maxsus renderlash yoki shriftning past darajadagi metrikalariga kirish zarur bo‘lganda o‘zini oqlaydi.
Oilalar ro‘yxati uchun UIFont.familyNames va PostScript nomlari uchun UIFont.fontNames(forFamilyName:) dan foydalaning. Ushbu kodni disk raskadrovka rejimida chaqiring va kerakli shriftni toping. PostScript nomi odatda oila nomi va shrift uslubini o‘z ichiga oladi: “SFProText-Regular”, “HelveticaNeue-Bold”.
Ha, UIFontDescriptor orqali o‘zgaruvchan o‘qlarni sozlash mumkin: weight, width, slant. Biroq, UIFont ning o‘zgaruvchan shriftlar uchun API i CTFontCopyVariation bilan solishtirganda cheklangan. O‘zgaruvchan o‘qlar ustidan to‘liq nazorat uchun Core Text va CTFontCreateCopyWithVariation dan foydalaning.
Nom va o‘lcham kombinatsiyasidan kalit bilan statik lug‘at yoki NSCache yarating. Tizim shriftlari uchun iOS namunalarni avtomatik keshlaydi, lekin UIFont(name:size:) orqali yaratilgan maxsus shriftlar uchun ob’ektlarni ilova keshida saqlash tavsiya etiladi, bu TTF faylidan qayta yuklashning oldini oladi.
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.