UIFont / CTFont — apa itu, jenis font dan Core Text

Penulis: IT Sectr Diterbitkan: 2026-07-23 Waktu membaca: 9 mnt

UIFont dan CTFont — adalah kelas untuk bekerja dengan font di iOS: UIFont dari UIKit untuk konfigurasi teks tingkat tinggi di UILabel dan UITextView, CTFont dari Core Text untuk rendering tingkat rendah dengan kontrol penuh atas glyph dan metrik. Menurut Apple Developer Documentation, UIFont digunakan di 90% komponen UI standar, sedangkan CTFont diterapkan di mesin teks dan editor kustom. Kedua kelas mewakili font yang sama, tetapi pada tingkat abstraksi yang berbeda.

Poin Utama

  • UIFont — kelas UIKit tingkat tinggi untuk bekerja dengan font di komponen UI
  • CTFont — kelas Core Text tingkat rendah untuk kontrol presisi atas tipografi
  • UIFont dibuat melalui systemFont, preferredFont atau initWithName, CTFont — melalui CTFontCreateWithName
  • Dynamic Type — sistem font adaptif iOS, secara otomatis bereaksi terhadap pengaturan aksesibilitas
  • CTFont menyediakan akses langsung ke metrik glyph, kerning, dan tabel OpenType

Apa itu UIFont dan CTFont?

UIFont — adalah kelas UIKit yang mewakili font untuk menampilkan teks di komponen UI: UILabel, UITextView, UITextField. Ini menyediakan antarmuka sederhana untuk mendapatkan font sistem dan kustom dengan menentukan ukuran, berat, dan gaya. UIFont tidak mengizinkan pengelolaan langsung kerning, ligatur, dan fitur OpenType — untuk ini digunakan Core Text.

CTFont — adalah tipe Core Text (CTFontRef) yang menyediakan akses tingkat rendah ke data font. CTFont bekerja langsung dengan Core Graphics untuk rendering, mendukung semua kemampuan OpenType dan TrueType, termasuk glyph alternatif, ligatur, dan font variabel. CTFont digunakan secara internal oleh UIKit untuk rendering UIFont, tetapi juga tersedia langsung untuk penggambaran kustom.

Toll-Free Bridging

UIFont dan CTFont mendukung toll-free bridging — konversi antar tipe tanpa biaya tambahan. Casting UIFont as CTFont atau CTFont as UIFont dimungkinkan di Swift dan Objective-C. Ini memungkinkan penggunaan API UIKit tingkat tinggi untuk konfigurasi dan Core Text tingkat rendah untuk rendering tanpa menyalin data font.

Font Descriptor

Kedua kelas menggunakan UIFontDescriptor (UIKit) / CTFontDescriptor (Core Text) untuk mendeskripsikan karakteristik font: nama, ukuran, berat, gaya, matriks transformasi. Descriptor adalah kamus atribut yang dapat dimodifikasi untuk membuat font baru berdasarkan yang sudah ada. Misalnya, menambahkan traitItalic ke descriptor untuk mendapatkan versi miring dari font yang sama.

UIFont — font UIKit

UIFont menyediakan beberapa metode pabrik untuk membuat font. systemFont(ofSize:) mengembalikan font sistem San Francisco (iOS) atau Helvetica (versi lama). boldSystemFont, italicSystemFont — varian dengan gaya. preferredFont(forTextStyle:) mengembalikan font Dynamic Type untuk gaya yang diberikan: .headline, .body, .caption1, .footnote. Font-font ini secara otomatis diskalakan saat pengaturan ukuran teks di sistem berubah.

Untuk memuat font kustom digunakan UIFont(name:size:) dengan nama PostScript font. Font harus ditambahkan sebelumnya ke Info.plist dan disertakan dalam bundle aplikasi. Menurut Apple, disarankan menggunakan UIFont untuk semua komponen UI standar dan beralih ke CTFont hanya ketika rendering kustom diperlukan.

Dynamic Type

Dynamic Type — sistem font adaptif yang diperkenalkan di iOS 7. Pengguna memilih ukuran teks yang diinginkan di Pengaturan — dari sangat kecil hingga sangat besar. UIFont.preferredFont secara otomatis mengembalikan font dengan ukuran yang sesuai. Untuk bekerja dengan benar, semua UILabel harus memiliki adjustsFontForContentSizeCategory = true. Dynamic Type wajib untuk kompatibilitas aksesibilitas.

UIFontDescriptor

UIFontDescriptor memungkinkan memodifikasi atribut font tanpa membuat instance baru dari awal. Metode addingAttributes(_:), withSymbolicTraits(_:), withFamily(_:) mengembalikan descriptor baru dengan parameter yang dimodifikasi. Ini berguna untuk mendapatkan varian font: menambahkan traitBold ke font sistem untuk mendapatkan versi tebal tanpa mengetahui nama PostScript.

CTFont — font Core Text

CTFont (CTFontRef) — adalah tipe Core Text untuk bekerja tingkat rendah dengan font. Ini dibuat dengan fungsi CTFontCreateWithName, CTFontCreateWithFontDescriptor, CTFontCreateCopyWithAttributes. Setiap fungsi mengembalikan font dengan antarmuka, ukuran, dan atribut opsional yang ditentukan. CTFont digunakan di Core Graphics untuk rendering teks pada UIView kustom melalui drawRect.

CTFont menyediakan akses ke metrik yang tidak tersedia di UIFont: CTFontGetGlyphsForCharacters mengembalikan array glyph untuk karakter yang diberikan, CTFontGetAdvancesForGlyphs — lebar setiap glyph, CTFontGetBoundingBox — batas glyph. Ini diperlukan untuk membangun tata letak teks kustom: kolom, rotasi, pembungkusan.

Metrik Font

CTFontGetAscent, CTFontGetDescent, CTFontGetLeading mengembalikan metrik vertikal font. CTFontGetUnitsPerEm — jumlah unit per em-square, digunakan untuk menghitung proporsi. CTFontGetGlyphCount — jumlah total glyph dalam font. Data ini kritis untuk tipografi percetakan dan tata letak kustom di mana diperlukan posisi yang presisi dari setiap karakter.

OpenType dan Font Variabel

CTFont mendukung fitur OpenType: CTFontCopyFeatures mengembalikan kamus fungsi font yang tersedia (ligatur, karakter alternatif, kerning), CTFontEnableFeature mengaktifkan opsi tertentu. Font variabel (Variable Fonts) dikonfigurasi melalui CTFontCopyVariation dan CTFontCreateCopyWithVariation, memungkinkan perubahan weight, width dan slant dalam rentang kontinu.

Cara menggunakan UIFont dalam kode

Pembuatan UIFont di Swift dilakukan melalui salah satu metode pabrik atau inisialisasi langsung berdasarkan nama. Metode yang paling umum adalah systemFont(ofSize:weight:) untuk font sistem atau preferredFont(forTextStyle:) untuk Dynamic Type. Untuk font kustom digunakan UIFont(name:size:) dengan menyebutkan nama PostScript.

Font Sistem dengan Berbagai Berat

UIFont.systemFont(ofSize:weight:) menerima UIFont.Weight — dari .ultraLight hingga .black. Metode ini mengembalikan font sistem San Francisco dengan berat yang sesuai. UIFont.monospacedSystemFont, UIFont.monospacedDigitSystemFont mengembalikan font monospace untuk kode dan angka. Semua font sistem secara otomatis mendukung 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

Setiap font dapat langsung ditetapkan ke properti font UILabel atau digunakan di NSAttributedString melalui NSFontAttributeName. Font sistem di-cache oleh iOS, jadi pembuatan ulang font sistem tidak menimbulkan biaya tambahan.

Font Kustom dari Bundle

Untuk menggunakan font kustom, tambahkan file TTF atau OTF ke bundle proyek dan tentukan di Info.plist (UIAppFonts). Nama PostScript font dapat diketahui melalui UIFont.familyNames dan UIFont.fontNames(forFamilyName:). Setelah registrasi, font tersedia melalui UIFont(name:size:) di titik mana pun dalam aplikasi.

swift
// Dapatkan semua nama keluarga font
for family in UIFont.familyNames {
    let names = UIFont.fontNames(forFamilyName: family)
    print("\(keluarga): \(nama)")
}
// Muat font kustom
if let customFont = UIFont(name: "MyCustomFont-Regular", size: 18) {
    label.font = customFont
}

Jika nama font salah, UIFont(name:size:) mengembalikan nil. Disarankan untuk menampilkan terlebih dahulu semua nama yang tersedia font melalui UIFont.familyNames dan UIFont.fontNames(forFamilyName:) saat debugging untuk memastikan font terdaftar dengan benar.

Font Kustom dengan UIFont dan CTFont

Memuat font kustom dimungkinkan dengan dua cara: registrasi statis melalui Info.plist (UIAppFonts) dan registrasi dinamis melalui CTFontManagerRegisterGraphicsFont. Cara pertama lebih sederhana — font tersedia segera setelah aplikasi dimulai. Cara kedua digunakan untuk font yang dimuat dari jaringan atau diunduh sesuai permintaan.

Registrasi dinamis berguna untuk sumber daya sesuai permintaan: jika aplikasi berisi 20+ font, tidak semuanya harus disertakan dalam bundle awal, tetapi dapat diunduh saat pertama kali digunakan. CTFontManagerRegisterFontsForURLs mendaftarkan font dari URL yang ditentukan. Setelah registrasi, font menjadi tersedia melalui UIFont(name:size:) seperti biasa.

CTFontCreateWithName untuk Font Kustom

Untuk rendering kustom melalui Core Text gunakan CTFontCreateWithName dengan nama PostScript font. Perbedaan dengan UIFont adalah CTFont dapat dibuat dengan matriks transformasi (CTFontCreateWithNameAndOptions) — untuk membuat font terdistorsi: memiringkan, menskala pada sumbu X, memutar. Ini tidak tersedia di UIFont tanpa menggunakan transformasi affine.

swift
// Buat CTFont dengan matriks miring
var matrix = CGAffineTransform(a: 1, b: 0, c: 0.2, d: 1, tx: 0, ty: 0)
let ctFont = CTFontCreateWithName(
    "Helvetica" as CFString,
    24, &matrix)
// Gunakan toll-free bridging dengan UIFont
let uiFont = ctFont as UIFont
label.font = uiFont

Matriks transformasi memungkinkan pembuatan varian italic tanpa file font terpisah. Parameter c (skew) menambahkan kemiringan pada karakter. Matriks juga memungkinkan penskalaan horizontal font — membuat varian terkompresi atau diperluas dari font yang sama.

Perbedaan UIFont dan CTFont

Perbedaan utama antara UIFont dan CTFont adalah tingkat abstraksi. UIFont menyediakan API sederhana untuk tugas-tugas umum: mendapatkan font sistem, mengubah ukuran, menerapkan ke UILabel. CTFont memberikan kontrol penuh atas font: akses ke glyph, metrik, tabel OpenType, dan sumbu variabel. Pilihan tergantung pada tugas.

KarakteristikUIFontCTFont
FrameworkUIKitCore Text
PembuatansystemFont / preferredFont / initWithNameCTFontCreateWithName / CTFontCreateWithDescriptor
Akses ke glyphTidakCTFontGetGlyphsForCharacters
Fitur OpenTypeTerbatas (UIFontDescriptor)Akses penuh
Font variabelMelalui UIFontDescriptorCTFontCopyVariation / CreateCopyWithVariation
RenderingOtomatis di komponen UICore Graphics, kustom

Untuk 95% tugas pengembangan iOS, UIFont sudah cukup. Core Text dengan CTFont dibenarkan saat membuat editor teks, generator PDF, buku dengan tata letak tipografi, atau aplikasi dengan tampilan kustom bahasa langka.

Kinerja dan Praktik Terbaik

Bekerja dengan font di iOS memerlukan pertimbangan kinerja. Setiap font unik dimuat ke memori saat pertama kali digunakan dan membutuhkan sumber daya. Font sistem San Francisco sudah dimuat sebelumnya dan tidak menimbulkan biaya tambahan. Font kustom dimuat dari file dan di-cache oleh sistem setelah pemuatan pertama.

Disarankan untuk membatasi jumlah font unik dalam aplikasi hingga 3-5 keluarga. Setiap font membutuhkan 50 KB hingga 2 MB di memori. Menggunakan berat berbeda dari keluarga yang sama (regular, bold, medium) lebih efisien daripada memuat beberapa keluarga berbeda.

Caching UIFont

Sistem menyimpan cache instance yang dibuat dari UIFont, jadi panggilan berulang UIFont.systemFont(ofSize: 16, weight: .regular) tidak membuat objek baru. Namun, UIFont(name:size:) untuk font kustom tidak selalu di-cache — disarankan untuk menyimpan font yang sering digunakan dalam properti statis atau cache NSCache untuk menghindari pemuatan ulang dari file.

Pemuatan Font Asinkron

Saat registrasi dinamis font melalui CTFontManagerRegisterGraphicsFont, proses dapat bersifat asinkron jika file font diunduh dari jaringan. Dalam hal ini, UILabel atau UITextView harus menampilkan font sistem cadangan hingga pemuatan selesai. Setelah registrasi, font menjadi tersedia, dan layar secara otomatis memperbarui tampilan teks.

Pertanyaan yang Sering Diajukan

Bisakah UIFont dikonversi ke CTFont dan sebaliknya?

Ya, UIFont dan CTFont mendukung toll-free bridging. Konversi dilakukan dengan casting sederhana: UIFont as CTFont atau CTFont as UIFont. Tidak ada biaya tambahan atau penyalinan data — kedua kelas menunjuk ke objek font yang sama di memori.

Mana yang lebih disukai untuk digunakan di UIKit?

Untuk semua komponen UI gunakan UIFont. Ini dioptimalkan untuk UIKit, mendukung Dynamic Type, dan diskalakan dengan benar saat pengaturan sistem berubah. CTFont hanya dibenarkan untuk rendering kustom melalui Core Graphics atau ketika akses ke metrik font tingkat rendah diperlukan.

Bagaimana cara mengetahui nama font untuk UIFont(name:size:)?

Gunakan UIFont.familyNames untuk daftar keluarga dan UIFont.fontNames(forFamilyName:) untuk nama PostScript. Panggil kode ini dalam mode debug dan temukan font yang diinginkan. Nama PostScript biasanya berisi nama keluarga dan gaya: “SFProText-Regular”, “HelveticaNeue-Bold”.

Apakah UIFont mendukung font variabel?

Ya, melalui UIFontDescriptor sumbu variabel dapat dikonfigurasi: weight, width, slant. Namun, API UIFont untuk font variabel terbatas dibandingkan dengan CTFontCopyVariation. Untuk kontrol penuh atas sumbu variabel gunakan Core Text dan CTFontCreateCopyWithVariation.

Bagaimana cara menyimpan cache UIFont dengan benar?

Buat kamus statis atau NSCache dengan kunci dari kombinasi nama dan ukuran. Untuk font sistem, iOS menyimpan cache instance secara otomatis, tetapi untuk font kustom yang dibuat melalui UIFont(name:size:), disarankan untuk menyimpan objek di cache aplikasi untuk menghindari pemuatan ulang dari file TTF.

Ringkasan

  • UIFont — kelas UIKit tingkat tinggi untuk font di komponen UI dengan Dynamic Type
  • CTFont — tipe Core Text tingkat rendah untuk rendering dan akses ke glyph
  • UIFont dibuat melalui systemFont, preferredFont atau UIFont(name:size:)
  • CTFont dibuat melalui CTFontCreateWithName atau CTFontCreateWithDescriptor
  • Toll-free bridging memungkinkan konversi gratis UIFont ke CTFont dan sebaliknya
  • Dynamic Type wajib untuk aksesibilitas: gunakan preferredFont dan adjustsFontForContentSizeCategory
  • Untuk UIKit gunakan UIFont, untuk rendering kustom — CTFont

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga