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 — 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.
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útum | Típus | Leírás |
|---|---|---|
| UIFontDescriptorFamily | String | Betűtípus család (SF Pro, Helvetica Neue) |
| UIFontDescriptorName | String | A betűtípus teljes neve (HelveticaNeue-Bold) |
| UIFontDescriptorSize | NSNumber | Betűméret pontokban |
| UIFontDescriptorMatrix | NSValue | Affin transzformációs mátrix |
| UIFontDescriptorTraits | [String: Any] | A vágás szimbolikus jellemzői |
| UIFontDescriptorTextStyle | String | Dynamic Type stílus (headline, body, caption) |
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.
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:
// 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.
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.
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 — 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.
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.
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
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.
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.
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.
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.
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ó
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.
Olvassa el is