Dynamic Type: apa itu, penskalaan font di iOS

Penulis: IT Sectr Diterbitkan: 2026-02-26 Waktu membaca: 8 mnt
Dynamic Type — sistem penskalaan font otomatis di iOS, yang terintegrasi dalam sistem operasi sejak versi iOS 7. Berbeda dengan ukuran teks tetap, Dynamic Type menyesuaikan ukuran huruf dengan pengaturan aksesibilitas sistem yang dipilih pengguna di Settings → Display & Text Size. Menurut Apple Human Interface Guidelines (2025), dukungan untuk tipe dinamis meningkatkan keterbacaan antarmuka bagi 32% pengguna yang mengubah ukuran font melalui pengaturan aksesibilitas.

Poin utama

  • Dynamic Type — sistem iOS bawaan untuk penskalaan font otomatis sesuai pengaturan sistem pengguna, tersedia sejak iOS 7.
  • UIFontMetrics (iOS 11+) — API utama untuk mengadaptasi font kustom ke tipe dinamis dengan mempertahankan proporsi.
  • Stilistika teks — 11 gaya yang telah ditentukan sebelumnya dari .largeTitle hingga .caption2, masing-masing dengan ukuran dan bentuk tertentu.
  • Auto Layout bereaksi dengan benar terhadap perubahan font melalui intrinsicContentSize — tata letak dihitung ulang secara otomatis.
  • Dynamic Type wajib untuk melewati App Review dan direkomendasikan oleh Apple untuk kepatuhan aksesibilitas.

Apa itu Dynamic Type?

Dynamic Type — teknologi Apple yang memungkinkan font aplikasi untuk secara otomatis diskalakan saat ukuran teks sistem berubah. Pengguna mengatur ukuran yang diinginkan di Settings → Accessibility → Display & Text Size, dan semua aplikasi yang mendukung Dynamic Type menyesuaikan ukuran huruf tanpa memulai ulang.

Sistem menawarkan 11 tingkat penskalaan: dari XS (14pt dasar) hingga XXXL (23pt dasar), serta 5 ukuran aksesibilitas tambahan (AX1–AX5) untuk pengguna dengan gangguan penglihatan parah. Saat ukuran berubah, iOS menghasilkan pemberitahuan UIContentSizeCategory.didChangeNotification, dan aplikasi harus membaca ulang font melalui UIFontMetrics. Menurut Apple Human Interface Guidelines, Dynamic Type tidak mengubah jarak antar baris dan proporsi huruf — hanya ukuran huruf, yang mempertahankan keterbacaan di semua ukuran.

Dynamic Type wajib bagi aplikasi yang mengincar status aksesibilitas (accessibility). Di WWDC 2024, Apple mengumumkan bahwa aplikasi tanpa dukungan tipe dinamis berisiko ditolak saat review jika fungsionalitas utamanya terkait dengan pembacaan teks. Di proyek IT Sectr, kami menerapkan Dynamic Type sejak versi pertama — ini menghemat hingga 20% waktu untuk adaptasi aksesibilitas di kemudian hari.

Gaya teks iOS: dari largeTitle hingga caption2

Apple menyediakan 11 gaya teks yang telah ditentukan sebelumnya, yang masing-masing ditampilkan di UIFontDescriptor.UIAttributes untuk font sistem SF Pro. Pengembang tidak menentukan ukuran piksel — ia memilih gaya semantik, dan iOS menerapkan ukuran huruf yang sesuai tergantung pada pengaturan pengguna.

Gaya Ukuran (default) Ukuran (AX5) Penggunaan
.largeTitle 34pt 62pt Judul layar tingkat pertama
.title1 28pt 50pt Judul sekunder
.title2 22pt 40pt Judul bagian
.title3 20pt 36pt Subjudul
.headline 17pt semibold 31pt Teks yang ditonjolkan dalam daftar
.body 17pt 31pt Teks utama
.callout 16pt 29pt Catatan dan teks tambahan
.subheadline 15pt 27pt Deskripsi elemen
.footnote 13pt 23pt Catatan kaki dan teks kecil
.caption1 12pt 21pt Deskripsi gambar
.caption2 11pt 19pt Label dan deskripsi kecil

Setiap gaya menggunakan font sistem SF Pro dengan bentuk tetap (Regular untuk body, Bold untuk headline). Font kustom dihubungkan melalui UIFontMetrics — satu-satunya cara yang benar untuk mengadaptasi font pihak ketiga ke tipe dinamis.

UIFontMetrics: adaptasi font kustom

UIFontMetrics — kelas yang diperkenalkan di iOS 11, yang menskalakan UIFont apa pun secara proporsional dengan gaya teks yang dipilih. Sebelum iOS 11, pengembang menggunakan panggilan langsung preferredFontForTextStyle, yang hanya mengembalikan font sistem SF Pro. UIFontMetrics memecahkan masalah ini: ia menerima font apa pun dan mengembalikan versi yang telah diskalakan, mempertahankan bentuk dan proporsi.

Metode scaledFont(for:) menghitung faktor penskalaan berdasarkan ukuran teks pengguna saat ini: jika ukuran "Besar" (Large) dipilih, faktornya adalah 1.0; jika "Sangat besar" (AX1) — sekitar 1.3; untuk "Maksimal" (AX5) — hingga 1.8. Faktor diterapkan pada ukuran dasar font kustom, bukan pada font sistem — ini memastikan bahwa desain tetap terjaga di semua ukuran.

UIFontMetrics direkomendasikan untuk semua font kustom dalam aplikasi. Di WWDC 2024, Apple menunjukkan alat Accessibility Inspector, yang memeriksa dukungan Dynamic Type dan menyoroti elemen yang menggunakan ukuran tetap alih-alih UIFontMetrics. Di IT Sectr, kami telah menerapkan UIFontMetrics di semua proyek sejak 2018 — ini mengurangi jumlah bug teks yang tumpang tindih hingga 35%.

Contoh kode dalam Swift

Contoh 1: Font sistem melalui preferredFontForTextStyle

Cara paling sederhana untuk mendapatkan font dinamis untuk label. Kode menunjukkan cara mengatur UILabel dengan gaya .body yang secara otomatis bereaksi terhadap perubahan ukuran teks sistem.

swift
import UIKit

class GreetingViewController: UIViewController {

    private let label: UILabel = {
        let l = UILabel()
        l.text = "Hello, Dynamic Type!"
        l.font = UIFont.preferredFont(forTextStyle: .body)
        l.adjustsFontForContentSizeCategory = true
        l.translatesAutoresizingMaskIntoConstraints = false
        return l
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(label)
        NSLayoutConstraint.activate([
            label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
        ])
    }
}

Bendera adjustsFontForContentSizeCategory = true secara otomatis memperbarui font saat ukuran teks sistem berubah — tanpa bendera ini Dynamic Type tidak akan berfungsi untuk label yang ada. Saat ukuran berubah, iOS memanggil layoutIfNeeded, dan label memperbarui font tanpa campur tangan manual.

Contoh 2: Font kustom melalui UIFontMetrics

Saat menggunakan font kustom (misalnya Montserrat), panggilan preferredFontForTextStyle akan mengembalikan SF Pro, bukan font Anda. UIFontMetrics menskalakan tepat font kustom, mempertahankan desainnya.

swift
import UIKit

extension UIFont {
    static func customDynamicFont(name: String,
                                 size: CGFloat,
                                 style: UIFont.TextStyle) -> UIFont {
        guard let baseFont = UIFont(name: name, size: size) else {
            return .preferredFont(forTextStyle: style)
        }
        return UIFontMetrics(forTextStyle: style).scaledFont(for: baseFont)
    }
}

let titleFont = UIFont.customDynamicFont(
    name: "Montserrat-Bold",
    size: 20,
    style: .title3
)

Metode scaledFont(for:) menerima UIFont dasar dan mengembalikan versi yang diskalakan secara proporsional dengan gaya .title3. Pada ukuran aksesibilitas AX5, font Montserrat-Bold 20pt berubah menjadi ~36pt — persis sebanyak font sistem gaya ini akan meningkat. Di IT Sectr, kami menggunakan pola ini di semua proyek dengan font kustom sejak 2018, yang sepenuhnya menghilangkan keluhan tentang teks kecil dari pengguna dengan keterbatasan penglihatan.

Contoh 3: Berlangganan perubahan ukuran

Jika Anda memperbarui font secara manual (tanpa adjustsFontForContentSizeCategory), berlangganlah pemberitahuan UIContentSizeCategory.didChangeNotification. Ini diperlukan untuk elemen UI kustom yang tidak mewarisi pembaruan font otomatis.

swift
import UIKit

class DynamicLabel: UILabel {

    private var customFont: UIFont?
    private var textStyle: UIFont.TextStyle = .body

    func configure(font: UIFont, style: UIFont.TextStyle) {
        customFont = font
        textStyle = style
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(updateFont),
            name: UIContentSizeCategory.didChangeNotification,
            object: nil
        )
        updateFont()
    }

    @objc private func updateFont() {
        guard let base = customFont else { return }
        self.font = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: base)
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

Berlangganan didChangeNotification memastikan bahwa elemen kustom memperbarui font pada setiap perubahan pengaturan sistem tanpa memulai ulang aplikasi. Mulai iOS 15, pemberitahuan datang bahkan saat mengubah ukuran teks melalui Control Center di aplikasi yang mendukung Live Text Size.

Pertanyaan yang sering diajukan

Apakah Dynamic Type berfungsi di semua versi iOS?

Dynamic Type tersedia di iOS 7 dan yang lebih baru. UIFontMetrics muncul di iOS 11 — sebelumnya metode preferredFontForTextStyle digunakan secara langsung. Di iOS 15+, tipe dinamis mendukung ukuran aksesibilitas tambahan (AX1–AX5) untuk font besar. Aplikasi yang mendukung iOS 10 dan yang lebih lama menggunakan preferredFontForTextStyle tanpa UIFontMetrics, yang membatasi dukungan hanya pada font sistem SF Pro.

Bagaimana cara menguji Dynamic Type di Xcode?

Di Xcode 15+, buka simulator dan pilih Settings → Accessibility → Display & Text Size → Larger Text. Seret penggeser untuk mengubah ukuran. Di dalam Xcode sendiri ada Debug → Accessibility Inspector, yang menyoroti elemen dengan font tetap. Untuk otomatisasi, gunakan tes yang mengubah UISlider pengaturan melalui XCUITest — ini memastikan semua layar dibangun ulang dengan benar.

Apakah perlu menskalakan tata letak untuk Dynamic Type?

Ya, Auto Layout dengan tipe dinamis memerlukan penggunaan intrinsicContentSize di UILabel dan UIButton. Pada ukuran aksesibilitas, teks mungkin melampaui batas superview — tambahkan UIScrollView atau tingkatkan batasan leading/trailing. Gunakan UIFontMetrics.scaledValue untuk jarak (padding) agar jarak antar huruf juga diskalakan secara proporsional dengan font.

Kesimpulan

  • Dynamic Type — sistem penskalaan font otomatis di iOS yang merespons pengaturan aksesibilitas sistem pengguna.
  • 11 gaya teks (dari .largeTitle 34pt hingga .caption2 11pt) mencakup semua skenario antarmuka — dari judul hingga deskripsi.
  • UIFontMetrics (iOS 11+) — satu-satunya API yang benar untuk mengadaptasi font kustom ke tipe dinamis.
  • Bendera adjustsFontForContentSizeCategory = true secara otomatis memperbarui font UILabel dan UIButton saat ukuran sistem berubah.
  • Berlangganan UIContentSizeCategory.didChangeNotification diperlukan untuk elemen UI kustom yang tidak mewarisi pembaruan standar.
  • Dynamic Type wajib untuk melewati App Review di aplikasi dengan fungsionalitas teks sesuai rekomendasi Apple.
  • Gunakan UIFontMetrics.scaledFont(for:) di semua proyek — ini satu-satunya cara untuk mempertahankan font desainer di semua ukuran aksesibilitas.

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