UIFont és CTFont — osztályok a betűtípusokkal való munkához iOS-ben: UIFont a UIKit-ből a szöveg magas szintű beállításához UILabel és UITextView elemekben, CTFont a Core Text-ből alacsony szintű megjelenítéshez teljes kontrollal a glífék és metrikák felett. Az Apple Developer Documentation szerint az UIFont a szabvány UI komponensek 90%-ban használatos, míg a CTFont egyedi szövegmotorokban és szerkesztőkben alkalmazzák. Mindkét osztály ugyanazt a betűtípust képviseli, de különböző absztrakciós szinten.
Főbb pontok
UIFont — egy UIKit osztály, amely egy betűtípust képvisel a szöveg megjelenítéséhez UI komponensekben: UILabel, UITextView, UITextField. Egyszerű interfészt biztosít rendszer és egyedi betűtípusok lekéréséhez a méret, vastagság és stílus megadásával. Az UIFont nem teszi lehetővé a kerning, ligatúrák és OpenType funkciók közvetlen kezelését — ehhez a Core Text használható.
CTFont — egy Core Text típus (CTFontRef), amely alacsony szintű hozzáférést biztosít a betűtípus adataihoz. A CTFont közvetlenül a Core Graphics-szal dolgozik a megjelenítéshez, támogatja az OpenType és TrueType összes képességét, beleértve az alternatív glíféket, ligatúrákat és változó betűtípusokat. A CTFont belsőleg használatos az UIKit-ben az UIFont megjelenítéséhez, de közvetlenül is elérhető egyedi rajzoláshoz.
Az UIFont és CTFont támogatja a toll-free bridging — típusok közötti konverziót többletköltség nélkül. Az UIFont as CTFont vagy CTFont as UIFont castolás lehetséges Swift és Objective-C nyelven. Ez lehetővé teszi a magas szintű UIKit API használatát konfigurációhoz és az alacsony szintű Core Text használatát megjelenítéshez a betűtípusadatok másolása nélkül.
Mindkét osztály a UIFontDescriptor (UIKit) / CTFontDescriptor (Core Text) használja a betűtípus jellemzőinek leírásához: név, méret, vastagság, stílus, transzformációs mátrix. A deskriptor egy attribútum szótár, amely módosítható és új betűtípusok hozhatók létre meglévők alapján. Például adj hozzá traitItalic-ot egy deskriptorhoz, és kapd meg ugyanazon betűtípus dőlt változatát.
UIFont számos gyári módszert biztosít betűtípusok létrehozásához. A systemFont(ofSize:) a San Francisco (iOS) vagy Helvetica (régebbi verziók) rendszerbetűtípust adja vissza. A boldSystemFont, italicSystemFont — változatok stílussal. A preferredFont(forTextStyle:) a Dynamic Type betűtípust adja vissza a megadott stílushoz: .headline, .body, .caption1, .footnote. Ezek a betűtípusok automatikusan méreteződnek a szövegméret beállításainak változásakor a rendszerben.
Egyedi betűtípusok betöltéséhez a UIFont(name:size:) használható a betűtípus PostScript neve alapján. A betűtípusnak előzetesen szerepelnie kell az Info.plist-ben és része kell legyen az alkalmazás bundle-jének. Az Apple szerint ajánlott az UIFont használata minden szabvány UI komponenshez, és csak egyedi megjelenítés szükségessége esetén áttérni a CTFont-ra.
Dynamic Type — adaptív betűtípusrendszer, amelyet iOS 7-ben vezettek be. A felhasználó kiválasztja a kívánt szövegméretet a Beállításokban — a nagyon kicsitől a nagyon nagyig. Az UIFont.preferredFont automatikusan visszaadja a megfelelő méretű betűtípust. A helyes működéshez minden UILabel-nek rendelkeznie kell a adjustsFontForContentSizeCategory = true beállítással. A Dynamic Type kötelező az akadálymentesítési megfelelőséghez.
UIFontDescriptor lehetővé teszi a betűtípus attribútumainak módosítását anélkül, hogy új példányt hoznál létre a semmiből. Az addingAttributes(_:), withSymbolicTraits(_:), withFamily(_:) módszerek új deskriptort adnak vissza módosított paraméterekkel. Ez kényelmes a betűtípusváltozatok lekéréséhez: adj hozzá traitBold-ot egy rendszerbetűtípushoz és kapd meg a félkövér verziót a PostScript név ismerete nélkül.
CTFont (CTFontRef) — egy Core Text típus az alacsony szintű betűtípus-munkához. A CTFontCreateWithName, CTFontCreateWithFontDescriptor, CTFontCreateCopyWithAttributes függvényekkel hozható létre. Minden függvény egy betűtípust ad vissza a megadott interfésszel, mérettel és opcionális attribútumokkal. A CTFont a Core Graphics-ben használatos szöveg megjelenítésére egyedi UIView-eken a drawRect-en keresztül.
A CTFont hozzáférést biztosít olyan metrikákhoz, amelyek nem érhetők el az UIFont-ban: a CTFontGetGlyphsForCharacters glíf tömböt ad vissza a megadott karakterekhez, a CTFontGetAdvancesForGlyphs — az egyes glífek szélességét, a CTFontGetBoundingBox — a glíf határait. Ez szükséges egyedi szövegelrendezések építéséhez: oszlopok, forgatás, szövegtörés.
CTFontGetAscent, CTFontGetDescent, CTFontGetLeading visszaadják a betűtípus függőleges metrikáit. CTFontGetUnitsPerEm — az egységek száma em-square-enként, az arányok kiszámításához használandó. CTFontGetGlyphCount — a glífek teljes száma a betűtípusban. Ezek az adatok kritikusak a nyomtatóipari tipográfiában és az egyedi tördelésekben, ahol minden egyes karakter pontos pozicionálása szükséges.
CTFont támogatja az OpenType funkciókat: a CTFontCopyFeatures visszaadja a betűtípus elérhető funkcióinak szótárát (ligatúrák, alternatív karakterek, kerning), a CTFontEnableFeature aktivál egy adott opciót. A változó betűtípusokat (Variable Fonts) a CTFontCopyVariation és CTFontCreateCopyWithVariation segítségével konfiguráljuk, lehetővé téve a weight, width és slant folyamatos tartományban történő módosítását.
UIFont létrehozása Swift-ben az egyik gyári módszeren vagy közvetlen név szerinti inicializáláson keresztül történik. A leggyakoribb módszer a systemFont(ofSize:weight:) rendszerbetűtípusokhoz vagy a preferredFont(forTextStyle:) a Dynamic Type-hoz. Egyedi betűtípusokhoz a UIFont(name:size:) használatos a PostScript név megadásával.
Az UIFont.systemFont(ofSize:weight:) UIFont.Weight-ot fogad — .ultraLight-tól .black-ig. Ez a módszer a San Francisco rendszerbetűtípust adja vissza a megfelelő vastagsággal. Az UIFont.monospacedSystemFont, UIFont.monospacedDigitSystemFont monospace betűtípusokat adnak vissza kódhoz és számokhoz. Minden rendszerbetűtípus automatikusan támogatja a Dynamic Type-ot.
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
Minden betűtípus közvetlenül hozzárendelhető az UILabel font tulajdonságához, vagy használható NSAttributedString-ben az NSFontAttributeName segítségével. A rendszerbetűtípusokat az iOS gyorsítótárba helyezi, így a rendszerbetűtípus újra létrehozása nem jár többletköltséggel.
Egyedi betűtípus használatához add hozzá a TTF vagy OTF fájlt a projekt bundle-jéhez, és add meg az Info.plist-ben (UIAppFonts). A betűtípus PostScript neve az UIFont.familyNames és UIFont.fontNames(forFamilyName:) segítségével állapítható meg. Regisztráció után a betűtípus elérhető a UIFont(name:size:) segítségével az alkalmazás bármely pontján.
// Összes betűtípuscsalád név lekérése
for family in UIFont.familyNames {
let names = UIFont.fontNames(forFamilyName: family)
print("\(család): \(nevek)")
}
// Egyedi betűtípus betöltése
if let customFont = UIFont(name: "MyCustomFont-Regular", size: 18) {
label.font = customFont
}
Ha a betűtípus neve helytelen, az UIFont(name:size:) nil-t ad vissza. Ajánlott az összes elérhető név előzetes kiírása az UIFont.familyNames és UIFont.fontNames(forFamilyName:) segítségével hibakeresés során, hogy megbizonyosodj a betűtípus helyes regisztrálásáról.
Egyedi betűtípusok betöltése két módon lehetséges: statikus regisztráció az Info.plist-en (UIAppFonts) keresztül és dinamikus regisztráció a CTFontManagerRegisterGraphicsFont segítségével. Az első módszer egyszerűbb — a betűtípus az alkalmazás elindítása után azonnal elérhető. A másodikat a hálózatról betöltött vagy igény szerint letöltött betűtípusokhoz használják.
A dinamikus regisztráció hasznos az igény szerinti erőforrásokhoz: ha az alkalmazás 20+ betűtípust tartalmaz, nem szükséges mindegyiket a kezdeti bundle-ban elhelyezni, hanem az első használatkor tölthetők le. A CTFontManagerRegisterFontsForURLs regisztrálja a betűtípusokat a megadott URL-ekről. Regisztráció után a betűtípus a UIFont(name:size:) segítségével érhető el, mint általában.
Egyedi megjelenítéshez a Core Text-en keresztül használd a CTFontCreateWithName-t a betűtípus PostScript neve alapján. A különbség az UIFont-hoz képest, hogy a CTFont létrehozható transzformációs mátrixxal (CTFontCreateWithNameAndOptions) — torzított betűtípusok létrehozásához: dőlés, skálázás az X tengelyen, forgatás. Ez nem elérhető az UIFont-ban affin transzformációk használata nélkül.
// CTFont létrehozása dőlés mátrixxal
var matrix = CGAffineTransform(a: 1, b: 0, c: 0.2, d: 1, tx: 0, ty: 0)
let ctFont = CTFontCreateWithName(
"Helvetica" as CFString,
24, &matrix)
// Toll-free bridging használata UIFont-tal
let uiFont = ctFont as UIFont
label.font = uiFont
A transzformációs mátrix lehetővé teszi italic változatok létrehozását külön betűtípusfájl nélkül. A c paraméter (skew) dőlést ad a karakterekhez. A mátrix a betűtípus vízszintes skálázását is lehetővé teszi — összenyomott vagy kiszélesített változatok létrehozását ugyanazon betűtípusból.
A fő különbség az UIFont és CTFont között az absztrakció szintje. Az UIFont egyszerű API-t biztosít a gyakori feladatokhoz: rendszerbetűtípus lekérése, méret módosítása, UILabel-re alkalmazása. A CTFont teljes kontrollt ad a betűtípus felett: hozzáférés glífékhez, metrikákhoz, OpenType táblákhoz és változó tengelyekhez. A választás a feladattól függ.
| Jellemző | UIFont | CTFont |
|---|---|---|
| Framework | UIKit | Core Text |
| Létrehozás | systemFont / preferredFont / initWithName | CTFontCreateWithName / CTFontCreateWithDescriptor |
| Hozzáférés glífekhez | Nem | CTFontGetGlyphsForCharacters |
| OpenType funkciók | Korlátozott (UIFontDescriptor) | Teljes hozzáférés |
| Változó betűtípusok | UIFontDescriptor-on keresztül | CTFontCopyVariation / CreateCopyWithVariation |
| Megjelenítés | Automatikus UI komponensekben | Core Graphics, egyedi |
Az iOS fejlesztési feladatok 95%-hoz elegendő az UIFont. A Core Text CTFont-tal szövegszerkesztők, PDF generátorok, tipográfiai tördelésű könyvek vagy ritka nyelvek egyedi megjelenítésével rendelkező alkalmazások létrehozásakor indokolt.
A betűtípusokkal való munka iOS-ben megköveteli a teljesítmény figyelembevételét. Minden egyedi betűtípus az első használatkor töltődik a memóriába, és erőforrásokat foglal. A San Francisco rendszerbetűtípusok előre betöltöttek, és nem jelentenek többletköltséget. Az egyedi betűtípusok fájlból töltődnek be, és az első betöltés után a rendszer gyorsítótárba helyezi őket.
Ajánlott az egyedi betűtípusok számának korlátozása az alkalmazásban 3-5 családra. Minden betűtípus 50 KB-tól 2 MB-ig terjedő helyet foglal a memóriában. Ugyanazon család különböző vastagságainak (regular, bold, medium) használata hatékonyabb, mint több különböző család betöltése.
A rendszer gyorsítótárba helyezi a létrehozott UIFont példányokat, így az UIFont.systemFont(ofSize: 16, weight: .regular) többszöri meghívása nem hoz lére új objektumot. Azonban az UIFont(name:size:) egyedi betűtípusokhoz nem mindig kerül gyorsítótárba — ajánlott a gyakran használt betűtípusok statikus tulajdonságokban vagy NSCache gyorsítótárban történő tárolása az ismételt fájlból történő betöltés elkerülése érdekében.
A betűtípusok CTFontManagerRegisterGraphicsFont segítségével történő dinamikus regisztrációjakor a folyamat aszinkron lehet, ha a betűtípusfájl a hálózatról töltődik le. Ebben az esetben az UILabel vagy UITextView elemeknek tartalék rendszerbetűtípust kell megjeleníteniük a betöltés befejeződéséig. Regisztráció után a betűtípus elérhetővé válik, és a képernyő automatikusan frissíti a szövegmegjelenítést.
Gyakran Ismételt Kérdések
Igen, az UIFont és CTFont támogatja a toll-free bridging-et. A konverzió egyszerű castolással történik: UIFont as CTFont vagy CTFont as UIFont. Nincs többletköltség vagy adatmásolás — mindkét osztály ugyanarra a betűtípusobjektumra mutat a memóriában.
Minden UI komponenshez használd az UIFont-ot. Optimalizált UIKit-re, támogatja a Dynamic Type-ot, helyesen méreteződik a rendszerbeállítások változásakor. A CTFont csak egyedi megjelenítéshez a Core Graphics-en keresztül vagy alacsony szintű betűtípusmetrikákhoz való hozzáférés esetén indokolt.
Használd a UIFont.familyNames tulajdonságot a családok listájához és az UIFont.fontNames(forFamilyName:) metódust a PostScript nevekhez. Hívd meg ezt a kódot hibakereső módban és keresd meg a kívánt betűtípust. A PostScript név általában tartalmazza a család nevét és a stílust: „SFProText-Regular”, „HelveticaNeue-Bold”.
Igen, a UIFontDescriptor segítségével konfigurálhatók a változó tengelyek: weight, width, slant. Az UIFont API a változó betűtípusokhoz azonban korlátozott a CTFontCopyVariation-hoz képest. A változó tengelyek feletti teljes kontrollhoz használd a Core Text-et és a CTFontCreateCopyWithVariation-t.
Hozz létre egy statikus szótárat vagy NSCache-et egy kulccsal, amely a név és méret kombinációjából áll. Rendszerbetűtípusok esetén az iOS automatikusan gyorsítótárba helyezi a példányokat, de az UIFont(name:size:) segítségével létrehozott egyedi betűtípusokhoz ajánlott az objektumok tárolása az alkalmazás gyorsítótárában a TTF fájlból történő ismételt betöltés elkerülése érdekében.
Ö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