Font Descriptor — adalah objek UIFontDescriptor di iOS dan NSFontDescriptor di macOS, yang merangkum semua metadata font: keluarga, rupa, ukuran, spasi antar huruf, spasi antar baris, dan atribut tipografi. Alih-alih membuat font secara langsung melalui UIFont(name:size:), pengembang mendeskripsikan karakteristik yang diinginkan melalui deskriptor, dan sistem memilih kecocokan terbaik dari font yang tersedia. Menurut Apple Developer Documentation, UIFontDescriptor mendukung lebih dari 20 atribut font dan digunakan di semua framework tipografi iOS — dari UIKit hingga Core Text dan SwiftUI.
Poin utama
Font Descriptor — adalah objek yang mendeskripsikan karakteristik font sebagai sekumpulan pasangan kunci-nilai, bukan sebagai file font tertentu. Alih-alih membuat font berdasarkan nama, pengembang menentukan keluarga, rupa, ukuran, dan atribut opsional, dan sistem memilih kecocokan terbaik. Pendekatan ini sangat penting untuk tipografi adaptif: deskriptor yang sama dapat bekerja di berbagai versi iOS di mana kumpulan font yang tersedia berbeda. Menurut iOS Human Interface Guidelines, pencocokan font melalui deskriptor adalah cara yang direkomendasikan untuk bekerja dengan font dinamis.
Tanpa Font Descriptor, pengembang harus memeriksa ketersediaan setiap font berdasarkan nama dan menentukan fallback secara manual. Deskriptor mengotomatiskan proses ini: ia berisi matriks kompatibilitas rupa — normal, tebal, miring, tebal miring — dan jika tidak ada kecocokan tepat, ia mengembalikan yang terdekat yang tersedia. Pencocokan sistem bekerja di tingkat Core Text dan tersedia baik di iOS maupun macOS melalui API NSFontDescriptor yang seragam.
Deskriptor juga digunakan untuk font kustom — dimuat melalui Info.plist atau ditambahkan secara manual. Jika font terdaftar di sistem, deskriptornya dibuat persis seperti untuk font sistem. Catatan lintas platform: konsep deskriptor juga ada di Android melalui Typeface.Builder, tetapi implementasi iOS melalui UIFontDescriptor memberikan atribut yang jauh lebih banyak — lebih dari 20 dibandingkan 5 di Android.
UIFontDescriptor berisi atribut yang dikelompokkan dalam kamus fontAttributes bertipe [UIFontDescriptor.AttributeName: Any]. Atribut kunci meliputi keluarga font (family), nama (name), ukuran (size), rupa (traits), matriks transformasi (matrix), ukuran optik (opticalSize), dan gaya teks (textStyle). Menurut Apple WWDC 2019 Session 227, penggunaan gaya teks — Dynamic Type — wajib untuk aplikasi yang kompatibel dengan aksesibilitas.
Atribut traits — adalah kamus yang berisi karakteristik simbolis: ketebalan (UIFontWeightTrait), kemiringan (UIFontSlantTrait), lebar (UIFontWidthTrait), dan lainnya. Nilai-nilai ini digunakan oleh pencocok font untuk memilih rupa. Misalnya, UIFontWeightTrait dengan nilai 0.0 — rupa normal, 0.3 — tebal. Sistem secara otomatis memetakan nilai numerik ke varian font yang tersedia.
Atribut tambahan meliputi featureSettings untuk fitur OpenType (ligatur, kerning, proporsi angka), visibleName untuk ditampilkan kepada pengguna, matrix untuk transformasi afin font, dan cascadeList untuk daftar font fallback berjenjang. Daftar lengkap atribut mencakup hampir semua skenario tipografi di iOS dan macOS.
| Atribut | Tipe | Deskripsi |
|---|---|---|
| UIFontDescriptorFamily | String | Keluarga font (SF Pro, Helvetica Neue) |
| UIFontDescriptorName | String | Nama lengkap font (HelveticaNeue-Bold) |
| UIFontDescriptorSize | NSNumber | Ukuran font dalam poin |
| UIFontDescriptorMatrix | NSValue | Matriks transformasi afin |
| UIFontDescriptorTraits | [String: Any] | Karakteristik simbolis rupa |
| UIFontDescriptorTextStyle | String | Gaya Dynamic Type (headline, body, caption) |
Cara utama bekerja dengan Font Descriptor di iOS — membuat deskriptor dengan pembuatan UIFont berikutnya. Ini adalah pendekatan yang lebih disukai ketika Anda perlu mendapatkan font dengan karakteristik tertentu tanpa mengetahui nama persisnya. Prosesnya terdiri dari dua langkah: membuat UIFontDescriptor melalui inisialisator dan memanggil metode font(withSize:) pada deskriptor.
import UIKit
// Buat deskriptor font untuk keluarga
let descriptor = UIFontDescriptor.init(
fontAttributes: [
.family: "SF Pro",
.traits: [
.weight: UIFont.Weight.bold
]
]
)
// Hasilkan UIFont dari deskriptor
let font = descriptor.font(withSize: 17)
Pendekatan ini menjamin bahwa sistem akan memilih kecocokan terbaik untuk rupa tebal SF Pro pada perangkat saat ini. Keunggulan utama — kode tidak bergantung pada versi iOS: di iOS 13 akan digunakan SF Pro, di versi yang lebih lama — Helvetica Neue atau font sistem default.
Untuk membuat font dengan ukuran dinamis, digunakan inisialisator dengan gaya teks dan skala. Dynamic Type secara otomatis menyesuaikan ukuran dengan pengaturan pengguna:
// Deskriptor Dynamic Type
let bodyDescriptor = UIFontDescriptor
.preferredFontDescriptor(withTextStyle: .body)
// Buat font tebal
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])
// Hasilkan UIFont dengan mempertahankan ukuran dinamis
let boldBodyFont = UIFont(
descriptor: boldDescriptor!,
size: bodyDescriptor.pointSize
)
Penting: metode withSymbolicTraits mengembalikan deskriptor opsional — jika rupa yang diminta tidak tersedia, ia mengembalikan nil. Selalu periksa opsional sebelum digunakan.
Font Descriptor mendukung model yang tidak dapat diubah — setiap metode modifikasi mengembalikan deskriptor baru dengan atribut yang diubah. Ini sesuai dengan semantik nilai dan membuat kode dapat diprediksi: deskriptor asli tidak pernah berubah. Metode modifikasi utama: addingAttributes untuk menambahkan atribut, withFace untuk mengubah rupa, withSize untuk mengubah ukuran, withMatrix untuk transformasi afin.
Metode addingAttributes — yang paling fleksibel. Ia menerima kamus atribut dan mengembalikan deskriptor baru. Jika ada kunci yang cocok, nilai baru menggantikan yang lama. Ini memungkinkan penggabungan perubahan: menambah berat, mengubah ukuran, dan mengaktifkan ligatur dalam satu panggilan. Menurut Apple Technical Q&A QA1682, addingAttributes adalah metode yang direkomendasikan untuk modifikasi massal melalui ekstensi.
Aplikasi praktis: membuat font untuk teks monospace di editor kode. Pengembang mengambil deskriptor monospace sistem, menambahkan berat yang dikurangi untuk garis tipis, dan meningkatkan spasi antar huruf melalui featureSettings. Ini memberikan kode yang lebih mudah dibaca tanpa memuat font terpisah.
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()
// Tambahkan atribut kustom
let customDescriptor = monoDescriptor.addingAttributes([
.size: 14,
.traits: [
.weight: UIFont.Weight.medium
]
])
let monoFont = UIFont(
descriptor: customDescriptor,
size: 14
)
Keterbatasan: tidak semua atribut dapat diubah setelah pembuatan deskriptor. Misalnya, keluarga font (family) ditetapkan satu kali saat inisialisasi. Jika perlu mengubah keluarga, buat deskriptor baru. Ini terkait dengan arsitektur Core Text, di mana deskriptor terikat pada sumber daya font tertentu.
Pencocokan font — fungsi utama Font Descriptor, yang secara otomatis memilih kecocokan terbaik untuk atribut yang diminta dari font yang terinstal. Prosesnya meliputi tiga tahap: penyaringan (menghilangkan font yang tidak cocok), pemeringkatan (mengurutkan berdasarkan tingkat kecocokan), dan pemilihan (mengembalikan hasil terbaik). Pencocokan dilakukan di tingkat Core Text — framework yang mendasari seluruh tipografi iOS.
Untuk mencari semua font yang cocok dengan deskriptor, digunakan metode matchingFontDescriptors. Ia mengembalikan array deskriptor yang diurutkan berdasarkan relevansi. Pengembang dapat memilih kecocokan tepat (elemen pertama) atau menelusuri varian untuk logika kustom. Menurut Apple Font Handling Guide, ini adalah satu-satunya cara untuk mendapatkan daftar rupa yang tersedia untuk keluarga tertentu tanpa enumerasi berdasarkan nama.
Skenario penggunaan: saat memilih font di antarmuka pengaturan teks. Pengguna memilih keluarga, dan aplikasi melalui matchingFontDescriptors mendapatkan semua rupa yang tersedia dan menampilkannya di picker. Tanpa pencocokan, Anda harus melakukan hardcode daftar varian yang berubah antar versi iOS.
let searchDescriptor = UIFontDescriptor.init(
fontAttributes: [.family: "SF Mono"]
)
// Dapatkan semua rupa yang tersedia
let matchingDescriptors = searchDescriptor
.matchingFontDescriptors(withMandatoryKeys: nil)
for descriptor in matchingDescriptors {
print(descriptor.object(forKey: .visibleName) ?? "unnamed")
}
Mandatory keys — parameter yang membatasi pencarian. Jika [.family] ditentukan, pencocokan akan mengembalikan semua font dari keluarga yang ditentukan. Jika [.family, .traits] ditentukan — hanya yang cocok baik keluarga maupun rupa. Penggunaan mandatory keys mempercepat pencocokan saat mencari subset font.
Kinerja: pencocokan adalah operasi sinkron yang memakan waktu 0,5 hingga 5 ms di iOS. Untuk pencarian tunggal ini tidak terasa, tetapi saat penelusuran massal deskriptor (misalnya, di picker dengan 50+ font), caching hasil direkomendasikan. Apple merekomendasikan melakukan pencocokan sekali saat memuat layar dan menyimpan array deskriptor.
Core Text — framework C tingkat rendah untuk bekerja dengan tipografi di iOS dan macOS. Padanan UIFontDescriptor-nya — CTFontDescriptor, yang menyediakan kemampuan yang sama di tingkat Core Foundation. CTFontDescriptor digunakan di API Core Text untuk membuat font, mengukur teks, dan merender tipografi kompleks. UIFontDescriptor pada dasarnya adalah pembungkus Objective-C di sekitar CTFontDescriptor dengan set atribut yang diperluas.
Toll-free bridging antara UIFontDescriptor dan CTFontDescriptor memungkinkan pengiriman deskriptor antara UIKit dan Core Text tanpa konversi. Ini sangat penting untuk aplikasi yang menggunakan rendering teks kustom — misalnya, editor teks berbasis TextKit atau editor kode dengan penyorotan sintaks. Contoh: CTFontDescriptorCreateCopyWithAttribute membuat salinan deskriptor dengan atribut yang ditambahkan — padanan addingAttributes dari UIFontDescriptor.
Atribut kunci kCTFontURLAttribute di CTFontDescriptor berisi URL file font. Ini memungkinkan menentukan apakah font tersebut sistem atau kustom. Untuk font kustom, URL mengarah ke file font (.ttf atau .otf), untuk font sistem — ke direktori font sistem. Data melalui deskriptor hanya dapat dibaca; mengubah file font melalui URL tidak didukung.
Untuk tipografi lanjutan — ligatur kustom, penggantian kontekstual, glyph alternatif — digunakan CTFontDescriptorCopyAttribute dengan kunci kCTFontFeatureSettingsAttribute. Atribut ini berisi array kamus fitur OpenType yang dapat ditambahkan melalui deskriptor. Menurut Apple Core Text Programming Guide, menggabungkan UIFontDescriptor dengan Core Text memberikan kontrol penuh atas tipografi aplikasi.
Pertanyaan yang sering diajukan
UIFont — adalah font siap pakai yang merender teks. Font Descriptor — adalah deskripsi font, sekumpulan atribut yang dapat digunakan untuk membuat UIFont. Satu deskriptor dapat menghasilkan banyak UIFont dengan ukuran berbeda.
Ya. Jika font terdaftar di sistem (melalui Info.plist atau Core Graphics), deskriptornya dibuat berdasarkan keluarga atau nama persis seperti untuk font sistem. Pencocokan berfungsi untuk semua font yang terdaftar.
Gunakan descriptor.object(forKey: .visibleName) untuk nama yang ditampilkan atau descriptor.postscriptName untuk nama PostScript. Nama PostScript digunakan saat membuat font melalui UIFont(name:size:).
Cascade list — adalah array deskriptor bersarang yang berfungsi sebagai font fallback. Jika font utama tidak mengandung karakter yang diperlukan, sistem secara berurutan memeriksa font dari cascade list. Digunakan untuk mendukung emoji dan karakter CJK.
Ya. SwiftUI mendukung Font Descriptor melalui Font(descriptor:size:). Pembungkus SwiftUI menerima UIFontDescriptor dan membuat font SwiftUI, mempertahankan semua atribut deskriptor — kerning, ligatur, dan rupa.
Kesimpulan
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