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 — 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.
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.
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 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 — 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 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 (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.
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.
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.
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.
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.
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.
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.
// 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.
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.
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.
// 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 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.
| Karakteristik | UIFont | CTFont |
|---|---|---|
| Framework | UIKit | Core Text |
| Pembuatan | systemFont / preferredFont / initWithName | CTFontCreateWithName / CTFontCreateWithDescriptor |
| Akses ke glyph | Tidak | CTFontGetGlyphsForCharacters |
| Fitur OpenType | Terbatas (UIFontDescriptor) | Akses penuh |
| Font variabel | Melalui UIFontDescriptor | CTFontCopyVariation / CreateCopyWithVariation |
| Rendering | Otomatis di komponen UI | Core 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.
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.
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.
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
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.
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.
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”.
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.
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
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.
Baca juga