Font Descriptor: a betűtípusleíró alapfogalmai és lehetőségei

Szerző: IT Sectr Megjelenés: 2026-07-23 Olvasási idő: 9 perc

Font Descriptor — az UIFontDescriptor objektum iOS-ben és az NSFontDescriptor macOS-ben, amely a betűtípus összes metaadatát inkapszulálja: család, vágás, méret, betűköz, sorköz és tipográfiai attribútumok. Ahelyett, hogy közvetlenül az UIFont(name:size:) segítségével hozná létre a betűtípust, a fejlesztő a kívánt jellemzőket egy leírón keresztül írja le, a rendszer pedig a legjobb egyezést választja ki az elérhető betűtípusok közül. Az Apple Developer Documentation szerint az UIFontDescriptor több mint 20 betűtípus-attribútumot támogat, és az összes iOS tipográfiai keretrendszerben használják — a UIKit-től a Core Text-en át a SwiftUI-ig.

Főbb pontok

  • Font Descriptor — a betűtípus leíró objektuma, amely metaadatokat tartalmaz a családról, vágásról, méretről és tipográfiai attribútumokról
  • Lehetővé teszi UIFont létrehozását attribútumok halmazából anélkül, hogy megadná a konkrét betűtípusnevet
  • Támogatja a meglévő betűtípus módosítását: méret, vágás, kerning megváltoztatása új objektum létrehozása nélkül
  • Használják a UIKit-ben, Core Text-ben és SwiftUI-ban betűtípusok keresésére és konfigurálására
  • Betűtípus-egyeztetést biztosít — a legközelebbi elérhető vágás automatikus kiválasztását

Mi az a Font Descriptor és miért van rá szükség

Font Descriptor — egy objektum, amely a betűtípus jellemzőit kulcs-érték párok halmazaként írja le, nem pedig konkrét betűtípusfájlként. Ahelyett, hogy név alapján hozna létre betűtípust, a fejlesztő megadja a családot, vágást, méretet és opcionális attribútumokat, a rendszer pedig kiválasztja a legjobb egyezést. Ez a megközelítés kulcsfontosságú az adaptív tipográfiában: ugyanaz a leíró működhet különböző iOS-verziókon, ahol az elérhető betűtípusok halmaza eltérő. Az iOS Human Interface Guidelines szerint a leírókon keresztüli betűtípus-egyeztetés a dinamikus betűtípusokkal való munka javasolt módja.

A Font Descriptor nélkül a fejlesztőnek ellenőriznie kellene minden betűtípus elérhetőségét név alapján és manuálisan meghatároznia a tartalékváltozatokat. A leíró automatizálja ezt a folyamatot: tartalmaz egy vágáskompatibilitási mátrixot — normál, félkövér, dőlt, félkövér dőlt — és pontos egyezés hiányában a legközelebbi elérhetőt adja vissza. Rendszerszintű egyeztetés a Core Text szintjén működik, és elérhető mind iOS-en, mind macOS-en az egységes NSFontDescriptor API-n keresztül.

A leírókat egyéni betűtípusokhoz is használják — az Info.plist-en keresztül betöltöttekhez vagy manuálisan hozzáadottakhoz. Ha egy betűtípus regisztrálva van a rendszerben, a leírója pontosan úgy jön létre, mint a rendszerbetűtípusoké. Platformok közötti megjegyzés: a leíró koncepciója Androidban is létezik a Typeface.Builder segítségével, de az iOS UIFontDescriptor megvalósítása lényegesen több attribútumot kínál — több mint 20-at az Android 5-ével szemben.

A Font Descriptor főbb tulajdonságai és attribútumai

UIFontDescriptor a fontAttributes [UIFontDescriptor.AttributeName: Any] típusú szótárában csoportosított attribútumokat tartalmaz. A kulcsfontosságú attribútumok közé tartozik a betűtípus családja (family), neve (name), mérete (size), vágása (traits), transzformációs mátrixa (matrix), optikai mérete (opticalSize) és szövegstílusa (textStyle). Az Apple WWDC 2019 Session 227 szerint a szövegstílusok — Dynamic Type — használata kötelező az akadálymentesítéssel kompatibilis alkalmazások számára.

A traits attribútum — egy szótár, amely szimbolikus jellemzőket tartalmaz: vastagság (UIFontWeightTrait), dőlés (UIFontSlantTrait), szélesség (UIFontWidthTrait) és mások. Ezeket az értékeket a betűtípus-egyeztető használja a vágás kiválasztásához. Például az UIFontWeightTrait 0.0 értékkel — normál vágás, 0.3 — félkövér. A rendszer automatikusan leképezi a numerikus értékeket az elérhető betűtípus-változatokra.

A további attribútumok közé tartozik a featureSettings az OpenType funkciókhoz (ligatúrák, kerning, számarányok), a visibleName a felhasználó számára történő megjelenítéshez, a matrix a betűtípus affin transzformációihoz és a cascadeList a tartalék betűtípusok lépcsőzetes listáihoz. Az attribútumok teljes listája gyakorlatilag az összes tipográfiai forgatókönyvet lefedi iOS-ben és macOS-ben.

AttribútumTípusLeírás
UIFontDescriptorFamilyStringBetűtípus család (SF Pro, Helvetica Neue)
UIFontDescriptorNameStringA betűtípus teljes neve (HelveticaNeue-Bold)
UIFontDescriptorSizeNSNumberBetűméret pontokban
UIFontDescriptorMatrixNSValueAffin transzformációs mátrix
UIFontDescriptorTraits[String: Any]A vágás szimbolikus jellemzői
UIFontDescriptorTextStyleStringDynamic Type stílus (headline, body, caption)

UIFont létrehozása Font Descriptor segítségével Swift-ben

A Font Descriptorral való munka elsődleges módja iOS-ben — a leíró létrehozása, majd a UIFont generálása. Ez az előnyben részesített megközelítés, ha egy adott jellemzőkkel rendelkező betűtípusra van szükség, de a pontos név nem ismert. A folyamat két lépésből áll: az UIFontDescriptor létrehozása inicializátorral, és a font(withSize:) metódus meghívása a leírón.

swift
import UIKit

// Hozzon létre betűtípus-leírót a családhoz
let descriptor = UIFontDescriptor.init(
    fontAttributes: [
        .family: "SF Pro",
        .traits: [
            .weight: UIFont.Weight.bold
        ]
    ]
)

// UIFont generálása a leíróból
let font = descriptor.font(withSize: 17)

Ez a megközelítés garantálja, hogy a rendszer a legjobb egyezést válassza az SF Pro félkövér vágásához az aktuális eszközön. Kulcsfontosságú előny — a kód nem függ az iOS verziójától: iOS 13-on SF Pro, régebbi verziókon Helvetica Neue vagy az alapértelmezett rendszerbetűtípus kerül használatra.

Dinamikus méretű betűtípus létrehozásához a szövegstílust és méretező inicializátort használjuk. A Dynamic Type automatikusan igazítja a méretet a felhasználó beállításaihoz:

swift
// Dynamic Type leíró
let bodyDescriptor = UIFontDescriptor
    .preferredFontDescriptor(withTextStyle: .body)

// Betűtípus félkövéré tétele
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])

// UIFont generálása a dinamikus méret megtartásával
let boldBodyFont = UIFont(
    descriptor: boldDescriptor!,
    size: bodyDescriptor.pointSize
)

Fontos: a withSymbolicTraits metódus opcionális leírót ad vissza — ha a kért vágás nem érhető el, nil értéket ad vissza. Mindig ellenőrizze az opcionálist használat előtt.

Attribútumok módosítása hozzáadással és cserével

A Font Descriptor egy megváltoztathatatlan modellt támogat — minden módosító metódus egy új leírót ad vissza a megváltoztatott attribútummal. Ez megfelel az érték-szemantikának, és kiszámíthatóvá teszi a kódot: az eredeti leíró soha nem változik. A fő módosító metódusok: addingAttributes attribútumok hozzáadásához, withFace a vágás módosításához, withSize a méret módosításához, withMatrix affin transzformációhoz.

Az addingAttributes metódus — a legrugalmasabb. Elfogad egy attribútum szótárat, és visszaad egy új leírót. Kulcsok egyezése esetén az új értékek felülírják a régieket. Ez lehetővé teszi a változtatások kombinálását: súly hozzáadása, méret módosítása és ligatúrák engedélyezése egyetlen hívásban. Az Apple Technical Q&A QA1682 szerint az addingAttributes a javasolt módszer a tömeges módosításra kiterjesztésen keresztül.

Gyakorlati alkalmazás: betűtípus létrehozása monospace szöveghez kódszerkesztőben. A fejlesztő veszi a rendszer monospace leíróját, csökkentett súlyot ad hozzá vékony vonalakhoz, és megnöveli a betűközt a featureSettings segítségével. Ez olvashatóbb kódot eredményez külön betűtípus betöltése nélkül.

swift
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()

// Egyéni attribútumok hozzáadása
let customDescriptor = monoDescriptor.addingAttributes([
    .size: 14,
    .traits: [
        .weight: UIFont.Weight.medium
    ]
])

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

Korlátozás: nem minden attribútum módosítható a leíró létrehozása után. Például a betűtípus családja (family) egyszer kerül beállításra az inicializáláskor. Ha meg kell változtatnia a családot, hozzon lére új leírót. Ez a Core Text architektúrájának köszönhető, ahol a leíró egy adott betűtípus-erőforráshoz van kötve.

Betűtípus-egyeztetés és rendszerbetűtípusok keresése

Betűtípus-egyeztetés — a Font Descriptor kulcsfontosságú funkciója, amely automatikusan kiválasztja a legjobb egyezést a kért attribútumokhoz a telepített betűtípusok közül. A folyamat három szakaszból áll: szűrés (a nem egyező betűtípusok kizárása), rangsorolás (rendezés az egyezés mértéke szerint) és kiválasztás (a legjobb eredmény visszaadása). Az egyeztetés a Core Text szintjén történik — ez a keretrendszer, amely az összes iOS tipográfia alapját képezi.

A leírónak megfelelő összes betűtípus kereséséhez a matchingFontDescriptors metódust használjuk. Ez a relevancia szerint rendezett leírók tömbjét adja vissza. A fejlesztő kiválaszthatja a pontos egyezést (első elem), vagy végiglapozhatja a változatokat egyéni logika számára. Az Apple Font Handling Guide szerint ez az egyetlen mód egy adott család elérhető vágásainak lekérésére név szerinti felsorolás nélkül.

Használati forgatókönyv: betűtípus kiválasztásakor a szövegbeállítási felületen. A felhasználó kiválaszt egy családot, és az alkalmazás a matchingFontDescriptors segítségével lekéri az összes elérhető vágást, és megjeleníti azokat egy választóban. Egyeztetés nélkül mereven kódolni kellene a változatok listáját, amely iOS-verziónként változik.

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

// Összes elérhető vágás lekérése
let matchingDescriptors = searchDescriptor
    .matchingFontDescriptors(withMandatoryKeys: nil)

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

Mandatory keys — paraméter, amely korlátozza a keresést. Ha [.family] van megadva, az egyeztetés a megadott család összes betűtípusát visszaadja. Ha [.family, .traits] van megadva — csak azokat, amelyek mind családban, mind vágásban egyeznek. A mandatory keys használata felgyorsítja az egyeztetést betűtípusok részhalmazának keresésekor.

Teljesítmény: az egyeztetés egy szinkron művelet, amely 0,5 és 5 ms között tart iOS-en. Egyetlen keresésnél ez észrevehetetlen, de a leírók tömeges lapozásánál (például egy 50+ betűtípusos választóban) az eredmények gyorsítótárolása javasolt. Az Apple azt ajánlja, hogy az egyeztetést egyszer végezzék el a képernyő betöltésekor, és tárolják a leírók tömbjét.

Integráció a Core Text-tel és a CTFontDescriptor-rel

Core Text — egy alacsony szintű C-alapú keretrendszer a tipográfiával való munkához iOS-ben és macOS-ben. Az UIFontDescriptor megfelelője — CTFontDescriptor, amely ugyanazokat a képességeket nyújtja a Core Foundation szintjén. A CTFontDescriptor a Core Text API-ban használatos betűtípusok létrehozására, szöveg mérésére és összetett tipográfia megjelenítésére. Az UIFontDescriptor lényegében egy Objective-C burkoló a CTFontDescriptor körül, kibővített attribútumkészlettel.

A toll-free bridging az UIFontDescriptor és a CTFontDescriptor között lehetővé teszi a leírók átadását az UIKit és a Core Text között konverzió nélkül. Ez kulcsfontosságú az egyéni szövegmegjelenítést használó alkalmazások számára — például a TextKit-alapú szövegszerkesztők vagy szintaxiskiemeléssel ellátott kódszerkesztők számára. Példa: a CTFontDescriptorCreateCopyWithAttribute másolatot készít a leíróról egy hozzáadott attribútummal — az UIFontDescriptor addingAttributes metódusának megfelelője.

A kCTFontURLAttribute kulcsattribútum a CTFontDescriptor-ben tartalmazza a betűtípusfájl URL-jét. Ez lehetővé teszi annak meghatározását, hogy a betűtípus rendszer- vagy egyéni-e. Egyéni betűtípusok esetén az URL a betűtípusfájlra (.ttf vagy .otf) mutat, rendszerbetűtípusok esetén — a rendszer betűtípuskönyvtárára. A leírón keresztüli adatok csak olvashatók; a betűtípusfájl URL-en keresztüli módosítása nem támogatott.

Fejlett tipográfiához — egyéni ligatúrák, kontextuális helyettesítések, alternatív glifák — a CTFontDescriptorCopyAttribute használatos a kCTFontFeatureSettingsAttribute kulccsal. Ez az attribútum OpenType funkciók szótárának tömbjét tartalmazza, amelyek a leírón keresztül adhatók hozzá. Az Apple Core Text Programming Guide szerint az UIFontDescriptor és a Core Text kombinációja teljes ellenőrzést biztosít az alkalmazás tipográfiája felett.

Gyakran ismételt kérdések

Miben különbözik a Font Descriptor az UIFont-tól?

UIFont — egy használatra kész betűtípus, amely megjeleníti a szöveget. A Font Descriptor — a betűtípus leírása, attribútumok halmaza, amelyből UIFont hozható létre. Egy leíró több különböző méretű UIFont-ot generálhat.

Használható a Font Descriptor egyéni betűtípusokhoz?

Igen. Ha a betűtípus regisztrálva van a rendszerben (Info.plist vagy Core Graphics útján), a leírója család vagy név alapján jön létre, pontosan úgy, mint a rendszerbetűtípusoké. Az egyeztetés minden regisztrált betűtípusra működik.

Hogyan kaphatom meg a betűtípus nevét a leíróból?

Használja a descriptor.object(forKey: .visibleName) metódust a megjelenítendő névhez, vagy a descriptor.postscriptName tulajdonságot a PostScript névhez. A PostScript név az UIFont(name:size:) segítségével történő betűtípus-létreho-záskor használatos.

Mi az a cascade list a Font Descriptor-ban?

Cascade list — egymásba ágyazott leírók tömbje, amelyek tartalék betűtípusokként szolgálnak. Ha a fő betűtípus nem tartalmazza a szükséges karaktert, a rendszer egymás után ellenőrzi a cascade list-ből származó betűtípusokat. Az emoji és CJK karakterek támogatására használják.

Működik a Font Descriptor a SwiftUI-ban?

Igen. A SwiftUI támogatja a Font Descriptort a Font(descriptor:size:) segítségével. A SwiftUI burkoló elfogad egy UIFontDescriptor-t, és létrehoz egy SwiftUI betűtípust, megtartva a leíró összes attribútumát — kerning, ligatúrák és vágás.

Összefoglaló

  • Font Descriptor — a betűtípus leíró objektuma család, vágás, méret és tipográfiai jellemzők attribútumokkal
  • Lehetővé teszi UIFont létrehozását attribútumok halmazából automatikus betűtípus-egyeztetéssel
  • Támogatja a megváltoztathatatlan módosítást az addingAttributes, withSize, withSymbolicTraits segítségével
  • A matchingFontDescriptors visszaadja az összes elérhető vágást betűtípusok kereséséhez és kiválasztásához
  • Integrálódik a Core Text-tel az UIFontDescriptor és a CTFontDescriptor közötti toll-free bridging segítségével
  • Támogatja a Dynamic Type-ot preferált szövegstílusok és skálázás segítségével
  • Adaptív tipográfiához ajánlott, amely az összes iOS-verziót támogatja a betűtípusok elérhetőségének ellenőrzése nélkül

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is