Font Descriptor: кључни појмови и могућности дескриптора фонта

Аутор: IT Sectr Објављено: 2026-07-23 Време читања: 9 мин

Font Descriptor — је објекат UIFontDescriptor у iOS-у и NSFontDescriptor у macOS-у, који инкапсулира све метаподатке фонта: породицу, рез, величину, размак између слова, проред између редова и атрибуте типографије. Уместо да креирате фонт директно путем UIFont(name:size:), програмер описује жељене карактеристике кроз дескриптор, а систем бира најбољу подударност из доступних фонтова. Према Apple Developer Documentation, UIFontDescriptor подржава преко 20 атрибута фонта и користи се у свим оквирима типографије iOS-а — од UIKit-а преко Core Text-а до SwiftUI-ја.

Главно

  • Font Descriptor — објекат-описник фонта који садржи метаподатке о породици, резу, величини и атрибутима типографије
  • Омогућуће креирање UIFont-а из скупа атрибута без навођења конкретног имена фонта
  • Подржава модификацију постојећег фонта: промену величине, реза, кернинга без стварања новог објекта
  • Користи се у UIKit-у, Core Text-у и SwiftUI-ју за претрагу и подешавање фонтова
  • Омогућуће подударање фонтова — аутоматски одабир најближег доступног реза

Шта је Font Descriptor и зашто је потребан

Font Descriptor — је објекат који описује карактеристике фонта као скуп парова кључ-вредност, а не као конкретан датотека фонта. Уместо креирања фонта по имену, програмер поставља породицу, рез, величину и опционалне атрибуте, а систем бира најбољу подударност. Овакав приступ је кључан за адаптивну типографију: исти дескриптор може да ради на различитим верзијама iOS-а, где се скуп доступних фонтова разликује. Према iOS Human Interface Guidelines, подударање фонтова путем дескриптора је препоручени начин рада са динамичким фонтовима.

Без Font Descriptor-а, програмер би морао да проверава доступност сваког фонта по имену и ручно одређује варијанте за предвидеће. Дескриптор аутоматизује овај процес: садржи матрицу компатибилности резова — нормални, подублјани, курзив, подубљани курзив — и у одсуству тачног поклапања враћа најближи доступан. Системско подударање ради на нивоу Core Text-а и доступно је и на iOS-у и на macOS-у путем јединственог NSFontDescriptor API-ја.

Дескриптори се такође користе за прилагођене фонтове — учитане путем Info.plist-а или додате ручно. Ако је фонт регистрован у систему, његов дескриптор се креира исто као за системски. Вишеплатформска напомена: концепт дескриптора постоји и у Android-у путем Typeface.Builder-а, али iOS имплементација кроз UIFontDescriptor пружа значајно више атрибута — преко 20 наспрам 5 у Android-у.

Основне особине и атрибути Font Descriptor-а

UIFontDescriptor садржи атрибуте груписане у речник fontAttributes типа [UIFontDescriptor.AttributeName: Any]. Кључни атрибути укључују породицу фонта (family), име (name), величину (size), рез (traits), матрицу трансформације (matrix), оптичку величину (opticalSize) и стил текста (textStyle). Према Apple WWDC 2019 Session 227, коришћеће стилова текста — Dynamic Type — је обавезно за апликације компатибилне са accessibility-јем.

Атрибут traits — је речник који садржи симболичке карактеристике: дебљину (UIFontWeightTrait), курзив (UIFontSlantTrait), ширину (UIFontWidthTrait) и друге. Ове вредности се користе за подударање фонтова за избор реза. На примјер, UIFontWeightTrait са вредношћу 0.0 — нормални рез, 0.3 — подубљани. Систем аутоматски мапира бројчане вредности у доступне варијанте фонта.

Додатни атрибути укључују featureSettings за OpenType могућности (лигатуре, кернинг, пропорције цифара), visibleName за приказ кориснику, matrix за афине трансформације фонта и cascadeList за каскадне листе резервних фонтова. Пуни списак атрибута покрива практично све сценарије типографије у iOS-у и macOS-у.

АтрибутТипОпис
UIFontDescriptorFamilyStringПородица фонта (SF Pro, Helvetica Neue)
UIFontDescriptorNameStringПуно име фонта (HelveticaNeue-Bold)
UIFontDescriptorSizeNSNumberВеличина фонта у тачкама
UIFontDescriptorMatrixNSValueАфина матрица трансформације
UIFontDescriptorTraits[String: Any]Симболичке карактеристике реза
UIFontDescriptorTextStyleStringDynamic Type стил (headline, body, caption)

Креирање UIFont-а путем Font Descriptor-а у Swift-у

Основни начин рада са Font Descriptor-ом у iOS-у — креирање дескриптора са наконним генерисањем UIFont-а. Ово је пожељни приступ када је потребно добити фонт са одређеним карактеристикама, а да се не зна тачан назив. Процес се састоји из два корака: креирање UIFontDescriptor-а путем иницијализатора и позив методе font(withSize:) на дескриптору.

swift
import UIKit

// Креирај дескриптор фонта за породицу
let descriptor = UIFontDescriptor.init(
    fontAttributes: [
        .family: "SF Pro",
        .traits: [
            .weight: UIFont.Weight.bold
        ]
    ]
)

// Генериши UIFont из дескриптора
let font = descriptor.font(withSize: 17)

Овај приступ гарантује да ће систем изабрати најбољу подударност за подубљани рез SF Pro-а на тренутном уређају. Кључна предност — код не зависи од верзије iOS-а: на iOS 13 користиће се SF Pro, на старијим верзијама — Helvetica Neue или подразумевани системски фонт.

За креирање фонта са динамичком величином користи се иницијализатор са стилом текста и размером. Dynamic Type аутоматски прилагођава величину под поставке корисника:

swift
// Dynamic Type дескриптор
let bodyDescriptor = UIFontDescriptor
    .preferredFontDescriptor(withTextStyle: .body)

// Подублјај фонт
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])

// Генериши UIFont са чувањем динамичке величине
let boldBodyFont = UIFont(
    descriptor: boldDescriptor!,
    size: bodyDescriptor.pointSize
)

Важно: метода withSymbolicTraits враћа опционални дескриптор — ако тражени рез није доступан, враћа се nil. Увијек проверавајте опционал пре употребе.

Модификација атрибута додавањем и заменом

Font Descriptor подржава имутабилни модел — свака метода модификације враћа нови дескриптор са измењеним атрибутом. Ово одговара семантици вредности и чини код предвидљивим: изворни дескриптор се никада не мења. Основне методе модификације: addingAttributes за додавање атрибута, withFace за промену реза, withSize за промену величине, withMatrix за афину трансформацију.

Метода addingAttributes — најфлексибилнија. Она прима речник атрибута и враћа нови дескриптор. У случају поклапања кључева, нове вредности замењују старе. Ово омогућава комбиновање промена: додавање тежине, промену величине и укључивање лигатура једним позивом. Према Apple Technical Q&A QA1682, addingAttributes је препоручени начин масовне модификације кроз екстензију.

Практична примена: креирање фонта за моноширани текст у уређивачу кода. Програмер узима системски monospace дескриптор, додаје смањену тежину за танке линије и повећава размак између слова путем featureSettings. Ово даје читљивији код без учитавања посебног фонта.

swift
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()

// Додај прилагођене атрибуте
let customDescriptor = monoDescriptor.addingAttributes([
    .size: 14,
    .traits: [
        .weight: UIFont.Weight.medium
    ]
])

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

Ограничење: нису сви атрибути могу да се промене након креирања дескриптора. На примјер, породица фонта (family) се поставља једном приликом при иницијализацији. Ако треба да промените породицу, креирајте нови дескриптор. Ово је повезано са архитектуром Core Text-а, где је дескриптор везан за одређени ресурс фонта.

Подударање фонтова и претрага системских фонтова

Подударање фонтова — кључна функција Font Descriptor-а, која аутоматски бира најбољу подударност за тражене атрибуте међу инсталираним фонтовима. Процес укључује три фазе: филтрацију (одбацивање некомпатибилних фонтова), рангирање (сортирање према степену подударности) и избор (враћање најбољег резултата). Подударање се обавља на нивоу Core Text-а — оквира који је у основи целокупне типографије iOS-а.

За претрагу свих фонтова који одговарају дескриптору, користи се метода matchingFontDescriptors. Она враћа низ дескриптора пореданих по релевантности. Програмер може да изабере тачно поклапање (први елеменат) или да пребира варијанте за прилагођену логику. Према Apple Font Handling Guide, ово је једини начин да се добије листа доступних резова за одређену породицу без набрајања по имену.

Сценаријо коришћећа: при избору фонта у интерфејсу подешавања текста. Корисник бира породицу, а апликација путем matchingFontDescriptors добија све доступне резове и приказује их у picker-у. Без подударања, било би потребно чврсто кодирати листу варијанта која се мења између верзија iOS-а.

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

// Добиј све доступне резове
let matchingDescriptors = searchDescriptor
    .matchingFontDescriptors(withMandatoryKeys: nil)

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

Mandatory keys — параметар који ограничава претрагу. Ако се наведе [.family], подударање ће вратити све фонтове наведене породице. Ако се наведе [.family, .traits] — само оне које се поклапају и по породици и по резу. Коришћеће mandatory keys убрзава подударање при претрази подскупа фонтова.

Перформансе: подударање је синхрона операција која траје од 0.5 до 5 ms на iOS-у. За јединичну претрагу то је неприметно, али при масовном пребирању дескриптора (на примјер, у picker-у са 50+ фонтова) препоручује се кеширање резултата. Apple препоручује да се подударање изврши једном приликом при учитавању екрана и сачува низ дескриптора.

Интеграција са Core Text-ом и CTFontDescriptor-ом

Core Text — нисконивоаски C оквир за рад са типографијом на iOS-у и macOS-у. Његов аналог UIFontDescriptor-а — CTFontDescriptor, који пружа исте могућности на нивоу Core Foundation-а. CTFontDescriptor се користи у Core Text API-ју за креирање фонтова, мерење текста и рендеровање сложене типографије. UIFontDescriptor је у суштини Objective-C омотач око CTFontDescriptor-а са проширеним скупом атрибута.

Toll-free bridging између UIFontDescriptor-а и CTFontDescriptor-а омогућава преношење дескриптора између UIKit-а и Core Text-а без конверзије. Ово је кључно за апликације које користе прилагођено рендеровање текста — на примјер, уређивачи текста засновани на TextKit-у или уређивачи кода са истицањем синтаксе. Примјер: CTFontDescriptorCreateCopyWithAttribute креира копију дескриптора са додатим атрибутом — аналог addingAttributes из UIFontDescriptor-а.

Key attribute kCTFontURLAttribute у CTFontDescriptor-у садржи URL датотеке фонта. Ово омогућава да се утврди да ли је фонт системски или прилагођени. За прилагођене фонтове, URL води до датотеке фонта (.ttf или .otf), за системске — до системског директоријума фонтова. Подаци кроз дескриптор доступни су само за читање; измена датотеке фонта путем URL-а није подржана.

За напредну типографију — прилагођене лигатуре, контекстуалне замене, алтернативне глифове — користи се CTFontDescriptorCopyAttribute са кључем kCTFontFeatureSettingsAttribute. Овај атрибут садржи низ речника OpenType могућности које се могу додати кроз дескриптор. Према Apple Core Text Programming Guide, комбиновање UIFontDescriptor-а са Core Text-ом пружа потпуну контролу над типографијом апликације.

Често постављана питања

По чему се Font Descriptor разликује од UIFont-а?

UIFont — је готов за употребу фонт који рендерује текст. Font Descriptor — је опис фонта, скуп атрибута од којих се може креирати UIFont. Један дескриптор може да породи више UIFont-а различитих величина.

Може ли се Font Descriptor користити за прилагођене фонтове?

Да. Ако је фонт регистрован у систему (путем Info.plist или Core Graphics-а), његов дескриптор се креира по породици или имену исто као за системске фонтове. Подударање ради за све регистроване фонтове.

Како добити име фонта из дескриптора?

Користите descriptor.object(forKey: .visibleName) за приказно име или descriptor.postscriptName за PostScript име. PostScript име се користи при креирању фонта путем UIFont(name:size:).

Шта је cascade list у Font Descriptor-у?

Cascade list — је низ угниеждених дескриптора који служе као резервни фонтови. Ако главни фонт не садржи потребан знак, систем узастопно проверава фонтове из cascade list-е. Користи се за подршку emoji-ја и CJK знакова.

Да ли Font Descriptor ради у SwiftUI-ју?

Да. SwiftUI подржава Font Descriptor кроз Font(descriptor:size:). SwiftUI омотач прима UIFontDescriptor и креира SwiftUI фонт, чувајући све атрибуте дескриптора — кернинг, лигатуре и рез.

Закључак

  • Font Descriptor — објекат-описник фонта са атрибутима породице, реза, величине и типографских карактеристика
  • Омогућуће креирање UIFont-а из скупа атрибута са аутоматским подударањем фонтова
  • Подржава имутабилну модификацију кроз addingAttributes, withSize, withSymbolicTraits
  • matchingFontDescriptors враћа све доступне резове за претрагу и избор фонтова
  • Интегрише се са Core Text-ом кроз toll-free bridging између UIFontDescriptor-а и CTFontDescriptor-а
  • Подржава Dynamic Type кроз пожељне стилове текста и мерење
  • Препоручује се за адаптивну типографију која подржава све верзије iOS-а без провере доступности фонтова

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође