UIFont / CTFont — co to jest, typy czcionek i Core Text

Autor: IT Sectr Opublikowano: 2026-07-23 Czas czytania: 9 min

UIFont i CTFont — to klasy do pracy z czcionkami w iOS: UIFont z UIKit do wysokopoziomowej konfiguracji tekstu w UILabel i UITextView, CTFont z Core Text do niskopoziomowego renderowania z pełną kontrolą nad glifami i metrykami. Według Apple Developer Documentation, UIFont jest używany w 90% standardowych komponentów UI, podczas gdy CTFont jest stosowany w niestandardowych silnikach tekstowych i edytorach. Obie klasy reprezentują tę samą czcionkę, ale na różnym poziomie abstrakcji.

Najważniejsze

  • UIFont — wysokopoziomowa klasa UIKit do pracy z czcionkami w komponentach UI
  • CTFont — niskopoziomowa klasa Core Text do precyzyjnej kontroli nad typografią
  • UIFont tworzy się przez systemFont, preferredFont lub initWithName, CTFont — przez CTFontCreateWithName
  • Dynamic Type — system adaptacyjnych czcionek iOS, automatycznie reagujący na ustawienia dostępności
  • CTFont zapewnia bezpośredni dostęp do metryk glifów, kerningu i tabel OpenType

Czym są UIFont i CTFont?

UIFont — to klasa UIKit reprezentująca czcionkę do wyświetlania tekstu w komponentach UI: UILabel, UITextView, UITextField. Zapewnia prosty interfejs do pobierania czcionek systemowych i niestandardowych z określeniem rozmiaru, wagi i stylu. UIFont nie pozwala bezpośrednio zarządzać kerningiem, ligaturami i funkcjami OpenType — do tego służy Core Text.

CTFont — to typ Core Text (CTFontRef) zapewniający niskopoziomowy dostęp do danych czcionki. CTFont działa bezpośrednio z Core Graphics do renderowania, obsługuje wszystkie możliwości OpenType i TrueType, w tym alternatywne glify, ligatury i czcionki zmienne. CTFont jest używany wewnętrznie przez UIKit do renderowania UIFont, ale jest także dostępny bezpośrednio do niestandardowego rysowania.

Toll-Free Bridging

UIFont i CTFont obsługują toll-free bridging — konwersję między typami bez dodatkowych kosztów. Rzutowanie UIFont as CTFont lub CTFont as UIFont jest możliwe w Swift i Objective-C. Pozwala to używać wysokopoziomowego API UIKit do konfiguracji i niskopoziomowego Core Text do renderowania bez kopiowania danych czcionki.

Font Descriptor

Obie klasy używają UIFontDescriptor (UIKit) / CTFontDescriptor (Core Text) do opisu cech czcionki: nazwy, rozmiaru, wagi, stylu, macierzy transformacji. Descriptor to słownik atrybutów, który można modyfikować i tworzyć nowe czcionki na podstawie istniejących. Na przykład dodać traitItalic do descriptor i otrzymać kursywną wersję tej samej czcionki.

UIFont — czcionki UIKit

UIFont udostępnia kilka metod fabrycznych do tworzenia czcionek. systemFont(ofSize:) zwraca czcionkę systemową San Francisco (iOS) lub Helvetica (starsze wersje). boldSystemFont, italicSystemFont — warianty z krojami. preferredFont(forTextStyle:) zwraca czcionkę Dynamic Type dla danego stylu: .headline, .body, .caption1, .footnote. Te czcionki automatycznie skalują się przy zmianie ustawień rozmiaru tekstu w systemie.

Do ładowania niestandardowych czcionek używa się UIFont(name:size:) z nazwą PostScript czcionki. Czcionka musi być wcześniej dodana do Info.plist i dołączona do pakietu aplikacji. Według Apple zaleca się używanie UIFont dla wszystkich standardowych komponentów UI i przejście na CTFont tylko w razie potrzeby niestandardowego renderowania.

Dynamic Type

Dynamic Type — system adaptacyjnych czcionek wprowadzony w iOS 7. Użytkownik wybiera preferowany rozmiar tekstu w Ustawieniach — od bardzo małego do bardzo dużego. UIFont.preferredFont automatycznie zwraca czcionkę odpowiedniego rozmiaru. Do prawidłowego działania wszystkie UILabel muszą mieć adjustsFontForContentSizeCategory = true. Dynamic Type jest obowiązkowy dla zgodności z dostępnością.

UIFontDescriptor

UIFontDescriptor pozwala modyfikować atrybuty czcionki bez tworzenia nowego egzemplarza od zera. Metody addingAttributes(_:), withSymbolicTraits(_:), withFamily(_:) zwracają nowy descriptor ze zmienionymi parametrami. Jest to wygodne do uzyskiwania wariantów czcionki: dodać traitBold do czcionki systemowej i otrzymać pogrubioną wersję, nie znając nazwy PostScript.

CTFont — czcionki Core Text

CTFont (CTFontRef) — to typ Core Text do niskopoziomowej pracy z czcionkami. Tworzy się go funkcjami CTFontCreateWithName, CTFontCreateWithFontDescriptor, CTFontCreateCopyWithAttributes. Każda funkcja zwraca czcionkę z określonym interfejsem, rozmiarem i opcjonalnymi atrybutami. CTFont jest używany w Core Graphics do renderowania tekstu na niestandardowych UIView przez drawRect.

CTFont zapewnia dostęp do metryk niedostępnych w UIFont: CTFontGetGlyphsForCharacters zwraca tablicę glifów dla podanych znaków, CTFontGetAdvancesForGlyphs — szerokość każdego glifu, CTFontGetBoundingBox — granice glifu. Jest to niezbędne do budowania niestandardowych układów tekstu: kolumn, obracania, opływania.

Metryki czcionki

CTFontGetAscent, CTFontGetDescent, CTFontGetLeading zwracają pionowe metryki czcionki. CTFontGetUnitsPerEm — liczba jednostek na em-square, używana do obliczania proporcji. CTFontGetGlyphCount — całkowita liczba glifów w czcionce. Te dane są krytyczne dla typografii poligraficznej i niestandardowych składów, gdzie wymagane jest precyzyjne pozycjonowanie każdego znaku.

OpenType i czcionki zmienne

CTFont obsługuje funkcje OpenType: CTFontCopyFeatures zwraca słownik dostępnych funkcji czcionki (ligatury, alternatywne znaki, kerning), CTFontEnableFeature aktywuje konkretną opcję. Czcionki zmienne (Variable Fonts) konfiguruje się przez CTFontCopyVariation i CTFontCreateCopyWithVariation, umożliwiając zmianę weight, width i slant w ciągłym zakresie.

Jak używać UIFont w kodzie

Tworzenie UIFont w Swift wykonuje się przez jedną z metod fabrycznych lub bezpośrednią inicjalizację po nazwie. Najczęstszym sposobem jest systemFont(ofSize:weight:) dla czcionek systemowych lub preferredFont(forTextStyle:) dla Dynamic Type. Do niestandardowych czcionek używa się UIFont(name:size:) z podaniem nazwy PostScript.

Czcionka systemowa z różnymi wagami

UIFont.systemFont(ofSize:weight:) przyjmuje UIFont.Weight — od .ultraLight do .black. Ta metoda zwraca czcionkę systemową San Francisco z odpowiednią wagą. UIFont.monospacedSystemFont, UIFont.monospacedDigitSystemFont zwracają czcionki o stałej szerokości do kodu i liczb. Wszystkie czcionki systemowe automatycznie obsługują Dynamic Type.

swift
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

Każdą czcionkę można bezpośrednio przypisać do właściwości font UILabel lub użyć w NSAttributedString przez NSFontAttributeName. Czcionki systemowe są buforowane przez iOS, więc ponowne utworzenie czcionki systemowej nie wiąże się z dodatkowymi kosztami.

Niestandardowa czcionka z Bundle

Aby użyć niestandardowej czcionki, dodaj plik TTF lub OTF do pakietu projektu i wskaż go w Info.plist (UIAppFonts). Nazwę PostScript czcionki można poznać przez UIFont.familyNames i UIFont.fontNames(forFamilyName:). Po rejestracji czcionka jest dostępna przez UIFont(name:size:) w dowolnym miejscu aplikacji.

swift
// Pobierz wszystkie nazwy rodzin czcionek
for family in UIFont.familyNames {
    let names = UIFont.fontNames(forFamilyName: family)
    print("\(rodzina): \(nazwy)")
}
// Wczytaj niestandardową czcionkę
if let customFont = UIFont(name: "MyCustomFont-Regular", size: 18) {
    label.font = customFont
}

Jeśli nazwa czcionki jest nieprawidłowa, UIFont(name:size:) zwraca nil. Zaleca się wcześniejsze wyświetlenie wszystkich dostępnych nazw czcionek przez UIFont.familyNames i UIFont.fontNames(forFamilyName:) podczas debugowania, aby upewnić się, że czcionka jest poprawnie zarejestrowana.

Niestandardowe czcionki z UIFont i CTFont

Ładowanie niestandardowych czcionek jest możliwe na dwa sposoby: statyczna rejestracja przez Info.plist (UIAppFonts) i dynamiczna rejestracja przez CTFontManagerRegisterGraphicsFont. Pierwszy sposób jest prostszy — czcionka jest dostępna natychmiast po uruchomieniu aplikacji. Drugi jest używany do czcionek ładowanych z sieci lub pobieranych na żądanie.

Dynamiczna rejestracja jest przydatna do zasobów na żądanie: jeśli aplikacja zawiera 20+ czcionek, nie wszystkie muszą być dołączone do początkowego pakietu, ale mogą być pobrane przy pierwszym użyciu. CTFontManagerRegisterFontsForURLs rejestruje czcionki z podanych URL. Po rejestracji czcionka staje się dostępna przez UIFont(name:size:) jak zwykle.

CTFontCreateWithName dla niestandardowej czcionki

Do niestandardowego renderowania przez Core Text użyj CTFontCreateWithName z nazwą PostScript czcionki. Różnica z UIFont polega na tym, że CTFont może być utworzony z macierzą transformacji (CTFontCreateWithNameAndOptions) — do tworzenia zniekształconych czcionek: pochylenia, skalowania w osi X, obrotu. Jest to niedostępne w UIFont bez użycia transformacji afinicznych.

swift
// Utwórz CTFont z macierzą pochylenia
var matrix = CGAffineTransform(a: 1, b: 0, c: 0.2, d: 1, tx: 0, ty: 0)
let ctFont = CTFontCreateWithName(
    "Helvetica" as CFString,
    24, &matrix)
// Użyj toll-free bridging z UIFont
let uiFont = ctFont as UIFont
label.font = uiFont

Macierz transformacji pozwala tworzyć warianty italic bez osobnego pliku czcionki. Parametr c (skew) dodaje pochylenie znakom. Macierz umożliwia również skalowanie czcionki w poziomie — tworząc ściśnięte lub rozszerzone warianty tej samej czcionki.

Różnice między UIFont a CTFont

Podstawowa różnica między UIFont a CTFont to poziom abstrakcji. UIFont zapewnia prosty API do typowych zadań: pobrać czcionkę systemową, zmienić rozmiar, zastosować do UILabel. CTFont daje pełną kontrolę nad czcionką: dostęp do glifów, metryk, tabel OpenType i osi zmiennych. Wybór zależy od zadania.

CechaUIFontCTFont
FrameworkUIKitCore Text
TworzeniesystemFont / preferredFont / initWithNameCTFontCreateWithName / CTFontCreateWithDescriptor
Dostęp do glifówNieCTFontGetGlyphsForCharacters
Funkcje OpenTypeOgraniczony (UIFontDescriptor)Pełny dostęp
Czcionki zmiennePrzez UIFontDescriptorCTFontCopyVariation / CreateCopyWithVariation
RenderowanieAutomatycznie w komponentach UICore Graphics, niestandardowe

Do 95% zadań iOS developmentu wystarczy UIFont. Core Text z CTFont jest uzasadniony przy tworzeniu edytorów tekstu, generatorów PDF, książek ze składem typograficznym lub aplikacji z niestandardowym wyświetlaniem rzadkich języków.

Wydajność i best practices

Praca z czcionkami w iOS wymaga uwzględnienia wydajności. Każda unikalna czcionka jest ładowana do pamięci przy pierwszym użyciu i zajmuje zasoby. Czcionki systemowe San Francisco są preładowane i nie generują dodatkowych kosztów. Niestandardowe czcionki są ładowane z pliku i buforowane przez system po pierwszym załadowaniu.

Zaleca się ograniczenie liczby unikalnych czcionek w aplikacji do 3–5 rodzin. Każda czcionka zajmuje od 50 KB do 2 MB w pamięci. Używanie różnych wag jednej rodziny (regular, bold, medium) jest bardziej efektywne niż ładowanie kilku różnych rodzin.

Buforowanie UIFont

System buforuje utworzone egzemplarze UIFont, więc ponowne wywołania UIFont.systemFont(ofSize: 16, weight: .regular) nie tworzą nowego obiektu. Jednak UIFont(name:size:) dla niestandardowych czcionek nie zawsze jest buforowany — zaleca się przechowywanie często używanych czcionek we właściwościach statycznych lub buforze NSCache, aby uniknąć ponownego ładowania z pliku.

Asynchroniczne ładowanie czcionek

Przy dynamicznej rejestracji czcionek przez CTFontManagerRegisterGraphicsFont proces może być asynchroniczny, jeśli plik czcionki jest pobierany z sieci. W takim przypadku UILabel lub UITextView powinny wyświetlać zapasową czcionkę systemową do czasu zakończenia ładowania. Po rejestracji czcionka staje się dostępna, a ekran automatycznie aktualizuje wyświetlanie tekstu.

Często zadawane pytania

Czy można przekonwertować UIFont na CTFont i odwrotnie?

Tak, UIFont i CTFont obsługują toll-free bridging. Konwersja wykonuje się prostym rzutowaniem: UIFont as CTFont lub CTFont as UIFont. Żadnych dodatkowych kosztów ani kopiowania danych nie ma — obie klasy wskazują na ten sam obiekt czcionki w pamięci.

Który jest preferowany do użycia w UIKit?

Do wszystkich komponentów UI używaj UIFont. Jest zoptymalizowany dla UIKit, obsługuje Dynamic Type, poprawnie skaluje się przy zmianie ustawień systemowych. CTFont jest uzasadniony tylko do niestandardowego renderowania przez Core Graphics lub gdy potrzebny jest dostęp do niskopoziomowych metryk czcionki.

Jak sprawdzić nazwę czcionki dla UIFont(name:size:)?

Użyj UIFont.familyNames do listy rodzin i UIFont.fontNames(forFamilyName:) do nazw PostScript. Wywołaj ten kod w trybie debugowania i znajdź potrzebną czcionkę. Nazwa PostScript zwykle zawiera nazwę rodziny i krój: „SFProText-Regular”, „HelveticaNeue-Bold”.

Czy UIFont obsługuje czcionki zmienne?

Tak, przez UIFontDescriptor można skonfigurować osie zmienne: weight, width, slant. Jednak API UIFont dla czcionek zmiennych jest ograniczone w porównaniu z CTFontCopyVariation. Do pełnej kontroli nad osiami zmiennymi używaj Core Text i CTFontCreateCopyWithVariation.

Jak prawidłowo buforować UIFont?

Utwórz statyczny słownik lub NSCache z kluczem z kombinacji nazwy i rozmiaru. W przypadku czcionek systemowych iOS buforuje egzemplarze automatycznie, ale dla niestandardowych czcionek utworzonych przez UIFont(name:size:) zaleca się przechowywanie obiektów w buforze aplikacji, aby uniknąć ponownego ładowania z pliku TTF.

Podsumowanie

  • UIFont — wysokopoziomowa klasa UIKit do czcionek w komponentach UI z Dynamic Type
  • CTFont — niskopoziomowy typ Core Text do renderowania i dostępu do glifów
  • UIFont tworzy się przez systemFont, preferredFont lub UIFont(name:size:)
  • CTFont tworzy się przez CTFontCreateWithName lub CTFontCreateWithDescriptor
  • Toll-free bridging pozwala bezpłatnie konwertować UIFont na CTFont i odwrotnie
  • Dynamic Type jest obowiązkowy dla dostępności: używaj preferredFont i adjustsFontForContentSizeCategory
  • Do UIKit używaj UIFont, do niestandardowego renderowania — CTFont

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również