UIFont / CTFont — bu nima, shrift turlari va Core Text

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

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 shriftlar bilan ishlash uchun yuqori darajadagi UIKit sinfi
  • CTFont — tipografiya ustidan aniq nazorat uchun past darajadagi Core Text sinfi
  • UIFont systemFont, preferredFont yoki initWithName orqali, CTFont — CTFontCreateWithName orqali yaratiladi
  • Dynamic Type — iOS moslashuvchan shrift tizimi, foydalanish imkoniyati sozlamalariga avtomatik javob beradi
  • CTFont glif metrikalari, kerning va OpenType jadvallariga to‘g‘ridan-to‘g‘ri kirishni ta’minlaydi

UIFont va CTFont nima?

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.

Toll-Free Bridging

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.

Shrift Deskriptori

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 — UIKit shriftlari

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

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

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 — Core Text shriftlari

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.

Shrift metrikalari

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.

OpenType va o‘zgaruvchan shriftlar

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.

Kodda UIFont-dan qanday foydalanish

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.

Turli og‘irliklar bilan tizim shrifti

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.

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

Bundle-dan maxsus shrift

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.

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

UIFont va CTFont bilan maxsus shriftlar

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.

Maxsus shrift uchun CTFontCreateWithName

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.

swift
// 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 farqlar

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.

XususiyatUIFontCTFont
FrameworkUIKitCore Text
YaratishsystemFont / preferredFont / initWithNameCTFontCreateWithName / CTFontCreateWithDescriptor
Gliflarga kirishYo‘qCTFontGetGlyphsForCharacters
OpenType xususiyatlariCheklangan (UIFontDescriptor)To‘liq kirish
O‘zgaruvchan shriftlarUIFontDescriptor orqaliCTFontCopyVariation / CreateCopyWithVariation
RenderlashUI komponentlarida avtomatikCore 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.

Ishlash va best practices

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.

UIFont keshlash

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.

Shriftlarni asinxron yuklash

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

UIFont ni CTFont ga va aksincha aylantirish mumkinmi?

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.

UIKit da foydalanish uchun qaysi biri afzal?

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.

UIFont(name:size:) uchun shrift nomini qanday topish mumkin?

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

UIFont o‘zgaruvchan shriftlarni qo‘llab-quvvatlaydimi?

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.

UIFont ni qanday to‘g‘ri keshlash mumkin?

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

  • UIFont — Dynamic Type bilan UI komponentlarida shriftlar uchun yuqori darajadagi UIKit sinfi
  • CTFont — renderlash va gliflarga kirish uchun past darajadagi Core Text turi
  • UIFont systemFont, preferredFont yoki UIFont(name:size:) orqali yaratiladi
  • CTFont CTFontCreateWithName yoki CTFontCreateWithDescriptor orqali yaratiladi
  • Toll-free bridging UIFont ni CTFont ga va aksincha bepul aylantirishga imkon beradi
  • Dynamic Type foydalanish imkoniyati uchun majburiy: preferredFont va adjustsFontForContentSizeCategory dan foydalaning
  • UIKit uchun UIFont, maxsus renderlash uchun — CTFont dan foydalaning

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