Font Descriptor: concepte cheie și capacitățile descriptorului de font

Autor: IT Sectr Publicat: 2026-07-23 Timp de citire: 9 min

Font Descriptor — este obiectul UIFontDescriptor în iOS și NSFontDescriptor în macOS, care încapsulează toate metadatele fontului: familia, forma, dimensiunea, spațierea dintre litere, spațierea dintre rânduri și atributele tipografice. În loc să creați un font direct prin UIFont(name:size:), dezvoltatorul descrie caracteristicile dorite prin descriptor, iar sistemul alege cea mai bună potrivire dintre fonturile disponibile. Conform Apple Developer Documentation, UIFontDescriptor suportă peste 20 de atribute ale fontului și este folosit în toate framework-urile de tipografie iOS — de la UIKit la Core Text și SwiftUI.

Principalele puncte

  • Font Descriptor — obiect-descriere a fontului care conține metadate despre familie, formă, dimensiune și atribute tipografice
  • Permite crearea UIFont dintr-un set de atribute fără a specifica numele concret al fontului
  • Suportă modificarea fontului existent: schimbarea dimensiunii, formei, kerning-ului fără a crea un obiect nou
  • Folosit în UIKit, Core Text și SwiftUI pentru căutarea și configurarea fonturilor
  • Asigură potrivirea fonturilor — selectarea automată a celei mai apropiate forme disponibile

Ce este Font Descriptor și de ce este necesar

Font Descriptor — este un obiect care descrie caracteristicile fontului ca un set de perechi cheie-valoare, nu ca un fișier de font concret. În loc să creați un font după nume, dezvoltatorul specifică familia, forma, dimensiunea și atributele opționale, iar sistemul alege cea mai bună potrivire. Această abordare este esențială pentru tipografia adaptivă: același descriptor poate funcționa pe diferite versiuni iOS, unde setul de fonturi disponibile diferă. Conform iOS Human Interface Guidelines, potrivirea fonturilor prin descriptori este metoda recomandată pentru lucrul cu fonturi dinamice.

Fără Font Descriptor, dezvoltatorul ar trebui să verifice disponibilitatea fiecărui font după nume și să determine manual variantele de rezervă. Descriptorul automatizează acest proces: conține o matrice de compatibilitate a formelor — normală, îngroșată, italică, îngroșată italică — iar în absența unei potriviri exacte, returnează cea mai apropiată disponibilă. Potrivirea sistemului funcționează la nivelul Core Text și este disponibilă atât pe iOS, cât și pe macOS prin intermediul API-ului unificat NSFontDescriptor.

Descriptorii sunt folosiți și pentru fonturi personalizate — încărcate prin Info.plist sau adăugate manual. Dacă un font este înregistrat în sistem, descriptorul său se creează exact ca pentru un font de sistem. Notă cross-platform: conceptul de descriptor există și în Android prin Typeface.Builder, dar implementarea iOS prin UIFontDescriptor oferă semnificativ mai multe atribute — peste 20 față de 5 în Android.

Principalele proprietăți și atribute ale Font Descriptor

UIFontDescriptor conține atribute grupate în dicționarul fontAttributes de tip [UIFontDescriptor.AttributeName: Any]. Atributele cheie includ familia fontului (family), numele (name), dimensiunea (size), forma (traits), matricea de transformare (matrix), dimensiunea optică (opticalSize) și stilul textului (textStyle). Conform Apple WWDC 2019 Session 227, utilizarea stilurilor de text — Dynamic Type — este obligatorie pentru aplicațiile compatibile cu accessibility.

Atributul traits — este un dicționar care conține caracteristicile simbolice: grosimea (UIFontWeightTrait), italic (UIFontSlantTrait), lățimea (UIFontWidthTrait) și altele. Aceste valori sunt folosite de potrivitorul de fonturi pentru selectarea formei. De exemplu, UIFontWeightTrait cu valoarea 0.0 — formă normală, 0.3 — îngroșată. Sistemul mapează automat valorile numerice în variantele disponibile ale fontului.

Atributele suplimentare includ featureSettings pentru funcții OpenType (ligaturi, kerning, proporții numerice), visibleName pentru afișare utilizatorului, matrix pentru transformări afine ale fontului și cascadeList pentru liste de fonturi de rezervă. Lista completă a atributelor acoperă practic toate scenariile de tipografie în iOS și macOS.

AtributTipDescriere
UIFontDescriptorFamilyStringFamilia fontului (SF Pro, Helvetica Neue)
UIFontDescriptorNameStringNumele complet al fontului (HelveticaNeue-Bold)
UIFontDescriptorSizeNSNumberDimensiunea fontului în puncte
UIFontDescriptorMatrixNSValueMatricea afină de transformare
UIFontDescriptorTraits[String: Any]Caracteristicile simbolice ale formei
UIFontDescriptorTextStyleStringStilul Dynamic Type (headline, body, caption)

Crearea UIFont prin Font Descriptor în Swift

Metoda principală de lucru cu Font Descriptor în iOS — crearea descriptorului cu generarea ulterioară a UIFont. Aceasta este abordarea preferată atunci când trebuie să obțineți un font cu anumite caracteristici fără a cunoaște numele exact. Procesul constă în doi pași: crearea UIFontDescriptor prin inițializator și apelarea metodei font(withSize:) pe descriptor.

swift
import UIKit

// Creează descriptor de font pentru familie
let descriptor = UIFontDescriptor.init(
    fontAttributes: [
        .family: "SF Pro",
        .traits: [
            .weight: UIFont.Weight.bold
        ]
    ]
)

// Generează UIFont din descriptor
let font = descriptor.font(withSize: 17)

Această abordare garantează că sistemul va alege cea mai bună potrivire pentru forma îngroșată a SF Pro pe dispozitivul curent. Avantajul cheie — codul nu depinde de versiunea iOS: pe iOS 13 va fi folosit SF Pro, pe versiunile mai vechi — Helvetica Neue sau fontul de sistem implicit.

Pentru crearea unui font cu dimensiune dinamică, se folosește inițializatorul cu stil de text și scară. Dynamic Type ajustează automat dimensiunea la setările utilizatorului:

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

// Face fontul îngroșat
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])

// Generează UIFont păstrând dimensiunea dinamică
let boldBodyFont = UIFont(
    descriptor: boldDescriptor!,
    size: bodyDescriptor.pointSize
)

Important: metoda withSymbolicTraits returnează un descriptor opțional — dacă forma solicitată nu este disponibilă, se returnează nil. Verificați întotdeauna opționalul înainte de utilizare.

Modificarea atributelor prin adăugare și înlocuire

Font Descriptor suportă un model imutabil — fiecare metodă de modificare returnează un nou descriptor cu atributul schimbat. Aceasta corespunde semanticii de valoare și face codul previzibil: descriptorul original nu se schimbă niciodată. Principalele metode de modificare: addingAttributes pentru adăugarea atributelor, withFace pentru schimbarea formei, withSize pentru schimbarea dimensiunii, withMatrix pentru transformarea afină.

Metoda addingAttributes — cea mai flexibilă. Primește un dicționar de atribute și returnează un nou descriptor. În cazul coincidenței cheilor, valorile noi le înlocuiesc pe cele vechi. Aceasta permite combinarea modificărilor: adăugarea greutății, schimbarea dimensiunii și activarea ligaturilor într-un singur apel. Conform Apple Technical Q&A QA1682, addingAttributes este metoda recomandată pentru modificarea în masă prin extensie.

Aplicație practică: crearea unui font pentru text monospațiat în editorul de cod. Dezvoltatorul ia descriptorul monospace de sistem, adaugă o greutate redusă pentru linii subțiri și mărește spațierea dintre litere prin featureSettings. Aceasta oferă un cod mai lizibil fără a încărca un font separat.

swift
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()

// Adaugă atribute personalizate
let customDescriptor = monoDescriptor.addingAttributes([
    .size: 14,
    .traits: [
        .weight: UIFont.Weight.medium
    ]
])

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

Limitare: nu toate atributele pot fi modificate după crearea descriptorului. De exemplu, familia fontului (family) se setează o singură dată la inițializare. Dacă trebuie să schimbați familia, creați un nou descriptor. Aceasta se datorează arhitecturii Core Text, unde descriptorul este legat de o anumită resursă de font.

Potrivirea fonturilor și căutarea fonturilor sistem

Potrivirea fonturilor — funcția cheie a Font Descriptor, care selectează automat cea mai bună potrivire pentru atributele solicitate dintre fonturile instalate. Procesul include trei etape: filtrarea (eliminarea fonturilor incompatibile), clasarea (sortarea după gradul de potrivire) și selectarea (returnarea celui mai bun rezultat). Potrivirea se execută la nivelul Core Text — framework-ul care stă la baza întregii tipografii iOS.

Pentru căutarea tuturor fonturilor corespunzătoare unui descriptor, se folosește metoda matchingFontDescriptors. Aceasta returnează un șir de descriptori sortați după relevanță. Dezvoltatorul poate alege potrivirea exactă (primul element) sau poate parcurge variantele pentru o logică personalizată. Conform Apple Font Handling Guide, acesta este singurul mod de a obține lista formelor disponibile pentru o anumită familie fără enumerare după nume.

Scenariu de utilizare: la selectarea fontului în interfața de setări text. Utilizatorul alege o familie, iar aplicația prin matchingFontDescriptors obține toate formele disponibile și le afișează în picker. Fără potrivire, ar trebui să codificați rigid lista de variante care se schimbă între versiunile iOS.

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

// Obține toate formele disponibile
let matchingDescriptors = searchDescriptor
    .matchingFontDescriptors(withMandatoryKeys: nil)

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

Mandatory keys — parametru care limitează căutarea. Dacă se specifică [.family], potrivirea va returna toate fonturile familiei specificate. Dacă se specifică [.family, .traits] — doar cele care se potrivesc atât ca familie, cât și ca formă. Utilizarea mandatory keys accelerează potrivirea la căutarea unui subset de fonturi.

Performanță: potrivirea este o operație sincronă care durează de la 0,5 până la 5 ms pe iOS. Pentru o singură căutare este imperceptibil, dar la parcurgerea în masă a descriptorilor (de exemplu, într-un picker cu 50+ fonturi) se recomandă memorarea în cache a rezultatelor. Apple recomandă efectuarea potrivirii o dată la încărcarea ecranului și păstrarea șirului de descriptori.

Integrarea cu Core Text și CTFontDescriptor

Core Text — un framework C de nivel scăzut pentru lucrul cu tipografia pe iOS și macOS. Analogul său UIFontDescriptor — CTFontDescriptor, care oferă aceleași capacități la nivelul Core Foundation. CTFontDescriptor este folosit în API-ul Core Text pentru crearea fonturilor, măsurarea textului și randarea tipografiei complexe. UIFontDescriptor este, în esență, o îmbrăcare Objective-C peste CTFontDescriptor cu un set extins de atribute.

Toll-free bridging între UIFontDescriptor și CTFontDescriptor permite transmiterea descriptorilor între UIKit și Core Text fără conversie. Aceasta este esențială pentru aplicațiile care folosesc randare personalizată a textului — de exemplu, editoare de text pe bază de TextKit sau editoare de cod cu evidențiere sintaxă. Exemplu: CTFontDescriptorCreateCopyWithAttribute creează o copie a descriptorului cu un atribut adăugat — analogul addingAttributes din UIFontDescriptor.

Atributul cheie kCTFontURLAttribute în CTFontDescriptor conține URL-ul fișierului de font. Aceasta permite să determinați dacă fontul este de sistem sau personalizat. Pentru fonturile personalizate, URL-ul duce la fișierul fontului (.ttf sau .otf), pentru cele de sistem — la directorul sistem de fonturi. Datele prin descriptor sunt disponibile doar pentru citire; modificarea fișierului de font prin URL nu este suportată.

Pentru tipografie avansată — ligaturi personalizate, înlocuiri contextuale, glife alternative — se folosește CTFontDescriptorCopyAttribute cu cheia kCTFontFeatureSettingsAttribute. Acest atribut conține un șir de dicționare ale funcțiilor OpenType care pot fi adăugate prin descriptor. Conform Apple Core Text Programming Guide, combinarea UIFontDescriptor cu Core Text oferă control complet asupra tipografiei aplicației.

Întrebări frecvente

Cu ce diferă Font Descriptor de UIFont?

UIFont — este un font gata de utilizare care randă textul. Font Descriptor — este o descriere a fontului, un set de atribute din care se poate crea UIFont. Un descriptor poate genera mai multe UIFont de dimensiuni diferite.

Se poate folosi Font Descriptor pentru fonturi personalizate?

Da. Dacă fontul este înregistrat în sistem (prin Info.plist sau Core Graphics), descriptorul său se creează după familie sau nume exact ca pentru fonturile de sistem. Potrivirea funcționează pentru orice fonturi înregistrate.

Cum obțin numele fontului din descriptor?

Folosiți descriptor.object(forKey: .visibleName) pentru numele afișabil sau descriptor.postscriptName pentru numele PostScript. Numele PostScript este folosit la crearea fontului prin UIFont(name:size:).

Ce este cascade list în Font Descriptor?

Cascade list — este un șir de descriptori imbricați care servesc drept fonturi de rezervă. Dacă fontul principal nu conține simbolul necesar, sistemul verifică succesiv fonturile din cascade list. Folosit pentru suportul emoji și caracterelor CJK.

Funcționează Font Descriptor în SwiftUI?

Da. SwiftUI suportă Font Descriptor prin Font(descriptor:size:). Îmbrăcarea SwiftUI primește UIFontDescriptor și creează un font SwiftUI, păstrând toate atributele descriptorului — kerning, ligaturi și formă.

Rezumat

  • Font Descriptor — obiect-descriere a fontului cu atribute ale familiei, formei, dimensiunii și caracteristicilor tipografice
  • Permite crearea UIFont dintr-un set de atribute cu potrivire automată a fonturilor
  • Suportă modificarea imutabilă prin addingAttributes, withSize, withSymbolicTraits
  • matchingFontDescriptors returnează toate formele disponibile pentru căutarea și selectarea fonturilor
  • Se integrează cu Core Text prin toll-free bridging între UIFontDescriptor și CTFontDescriptor
  • Suportă Dynamic Type prin stiluri de text preferate și scalare
  • Recomandat pentru tipografia adaptivă care suportă toate versiunile iOS fără verificarea disponibilității fonturilor

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și