Dynamic Type: temel kavramlar, metin stilleri ve iOS’ta nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-05-16 Okuma süresi: 9 dk

Dynamic Type, kullanıcının sistem ayarlarına göre uygulamadaki yazı tipi boyutunu otomatik olarak değiştiren yerleşik bir iOS özelliğidir. Kullanıcı, Ayarlar → Ekran ve Parlaklık → Metin Boyutu’ndan tercih ettiği metin boyutunu ayarlar ve Dynamic Type’ı destekleyen tüm uygulamalar ek bir işlem gerektirmeden uyum sağlar. Apple Human Interface Guidelines, 2024’e göre Dynamic Type desteği, App Store’da yayınlamak için zorunlu bir gerekliliktir, çünkü iOS platformunda erişilebilirliğin temel öğesidir.

Önemli Noktalar

  • Dynamic Type — metni sistem yazı tipi boyutu ayarlarına göre otomatik olarak ölçekleyen bir iOS mekanizması
  • Destek, metin stilleri (UIFont.TextStyle) — body, headline, caption, title ve diğerleri aracılığıyla sağlanır
  • Sistem, XSmall’dan AccessibilityXXXL’ye kadar 11 seviye ölçeklemeyi destekler
  • Özel yazı tipleri için UIFontMetrics yöntemi kullanılır ve herhangi bir yazı tipini body stiline göre ölçekler
  • Düzen uyarlanabilir olmalıdır — UIStackView, Auto Layout ve dinamik hücre yükseklikleri zorunludur

iOS’ta Dynamic Type Nedir

Dynamic Type, iOS 7 ile tanıtılan ve bir uygulamadaki metnin sistem yazı tipi boyutu ayarlarına otomatik olarak uyum sağlamasını sağlayan bir iOS teknolojisidir. Kullanıcı, tüm uygulamalarda aynı anda yazı tipini büyütüp küçültebilir — her bir uygulamanın içindeki ayarları ayrı ayrı değiştirmeye gerek kalmadan.

Apple WWDC 2023, “Make Your App Visually Accessible”’e göre, iOS kullanıcılarının %40’ından fazlası yazı tipi boyutunu varsayılandan değiştiriyor. 65+ yaş grubu için bu rakam %70’e ulaşıyor. Dynamic Type, App Store erişilebilirlik sertifikası için zorunlu bir gerekliliktir. Desteğin olmaması, inceleme sırasında uygulamanın reddedilme nedenidir.

Nasıl çalışır: Uygulama, UIFont(name:size:) yerine UIFont.preferredFont(forTextStyle:) kullanır. iOS, geçerli sistem ayarına göre ölçeklenmiş bir yazı tipini otomatik olarak döndürür. Ayarlarda boyut değiştiğinde, iOS UIContentSizeCategory.didChangeNotification bildirimi oluşturur — uygulama düzeni yeniden hesaplamalıdır.

Dynamic Type’ın Geçmişi

Dynamic Type, iOS 7 ile düz tasarımla birlikte ortaya çıktı. iOS 10, UIFontMetrics aracılığıyla özel yazı tipleri için destek ekledi. iOS 11, erişilebilirlik seviyelerini (AccessibilityXXXL’ye kadar) tanıttı. iOS 15, SwiftUI’da otomatik destekle Dynamic Type’ı ekledi. Her sürümle birlikte Apple gereksinimleri sıkılaştırıyor: iOS 17’den itibaren Dynamic Type desteği olmayan uygulamalar, App Store Connect’e yüklenirken bir uyarı alır.

UIFont.TextStyle Metin Stilleri

iOS, varsayılan ayar için 8 metin stili sağlar, her biri önceden tanımlanmış boyut ve kalınlığa sahiptir:

StilSabitBoyut (L)Amaç
Large Title.largeTitle34pxEkran ana başlığı
Title 1.title128pxBölüm başlığı
Title 2.title222pxAlt başlık
Title 3.title320pxKart başlığı
Headline.headline17px (kalın)Vurgu için kalın
Body.body17pxAna metin
Callout.callout16pxTamamlayıcı metin
Caption 1.caption112pxGörsel alt yazısı
Caption 2.caption211pxKüçük alt yazı
Footnote.footnote13pxDipnot, açıklama

Doğru stili kullanmak sadece “görünüm” meselesi değildir. UIFont.TextStyle.body, AccessibilityXXXL modunda 53px’e ulaşabilir. Bir uygulama body için sabit 17px yazı tipi kullanıyorsa, yazı tipi boyutunu büyüten kullanıcılar için metin okunamaz hale gelir.

Stiller Aracılığıyla Görsel Hiyerarşi

Dynamic Type sadece ölçeklemez — görsel hiyerarşiyi korur. Large Title her zaman Title 1’den büyüktür ve Title 1 de Body’den büyüktür. Ölçekleme katsayıları farklıdır: başlıklar, ana metinden daha agresif şekilde ölçeklenir, böylece hiyerarşi erişilebilirlik seviyelerinde bile korunur.

Ölçekleme Seviyeleri

iOS, metin ölçeklemenin 11 seviyesini destekler, iki kategoriye ayrılmıştır:

  • Standart boyutlar (5 seviye): XS, S, M, L (varsayılan), XL
  • Erişilebilirlik boyutları (6 seviye): accessibilityXL, accessibilityXXL, accessibilityXXXL, accessibilityXXXXL, accessibilityXXXXXL, accessibilityXXXXXXL

Body stili için XS ve AccessibilityXXXL arasındaki fark 14px ile 53px arasındadır — neredeyse 4 katı. 17px için tasarlanmış bir düzen 53px’te tamamen bozulur: metin taşar, düğmeler üst üste biner, hücreler çarpışır.

Kodda geçerli kategoriyi kontrol edin:

swift
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
    // Alternatif düzeni etkinleştir
}

traitCollection ve Metin Boyutu

Metin boyutu kategorisine traitCollection.uiContentSizeCategory üzerinden erişilebilir. Sistem ayarı değiştiğinde iOS, tüm UIView’lerde traitCollectionDidChange’ı çağırır. Bu yöntemde yazı tiplerini güncellemeli ve düzeni yeniden hesaplamalısınız. SwiftUI bunu otomatik olarak yapar — UIKit manuel abonelik gerektirir.

UICollectionView için UICollectionViewCompositionalLayout kullanın — ekran genişliğine ve metin boyutuna göre sütun sayısını otomatik olarak ayarlar. Erişilebilirlik seviyelerinde, metnin kesilmemesi ve öğelerin üst üste binmemesi için iki sütunlu düzen tek sütunlu düzene geçin. Koşullu düzen kullanın: normal genişlik için — iki sütun, kompakt veya erişilebilirlik için — tek sütun.

UIKit’te Uygulama

UIKit’te temel uygulama — UIFont.preferredFont(forTextStyle:). Bu yöntem, geçerli sistem ayarına göre ölçeklenmiş bir yazı tipi döndürür:

swift
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)

Özel yazı tipleri için UIFontMetrics kullanın:

swift
let customFont = UIFont(name: "Montserrat-Regular", size: 16)!
titleLabel.font = UIFontMetrics(forTextStyle: .body)
    .scaledFont(for: customFont)

// Boyut değişikliklerini izleme
NotificationCenter.default.addObserver(
    self,
    selector: #selector(preferredContentSizeChanged),
    name: UIContentSizeCategory.didChangeNotification,
    object: nil
)

Interface Builder’da UILabel için, yazı tipini bir metin stili olarak ayarlayın ve “Automatically Adjusts Font”’u etkinleştirin. Özel yazı tipleri için Interface Builder, UIFontMetrics’ı desteklemez — yalnızca kod aracılığıyla.

UIFontMetrics ve Ölçekleme Eğrisi

UIFontMetrics, preferredFont ile aynı ölçekleme eğrisini kullanır. fromTextStyle: .body, .headline vb. belirtebilirsiniz. Her stilin kendi ölçekleme katsayısı vardır. Body ılımlı şekilde ölçeklenir, Large Title agresif şekilde ölçeklenir. Özel yazı tipiniz ana metin için kullanılıyorsa .body kullanın.

SwiftUI’da Dynamic Type

SwiftUI’da Dynamic Type desteği varsayılan olarak yerleşiktir. Tüm sistem değiştiricileri (.font(.body), .font(.title)) otomatik olarak ölçeklenir. Geliştiricinin UIFont.preferredFont çağırmasına gerek yoktur.

Örnek:

swift
Text("Ana metin")
    .font(.body)
    .lineLimit(nil)
    .minimumScaleFactor(0.5)

Özel ölçekler için DynamicTypeSize kullanın:

swift
@Environment(\.dynamicTypeSize) var dynamicTypeSize

var body: some View {
    Text("Uyarlanabilir metin")
        .font(.body)
        .padding(dynamicTypeSize <= .large ? 8 : 16)
}

SwiftUI, sistem metin boyutu değiştiğinde görünümü otomatik olarak günceller — ek bildirim abonelikleri gerekmez.

SwiftUI’da Dynamic Type’ı Sınırlama

.font(.body) değiştiricisi yalnızca sistem yazı tipiyle çalışır. SwiftUI’da özel yazı tipleri için, dahili olarak UIFontMetrics ile Font.custom kullanın. iOS 16’dan itibaren SwiftUI, @Environment içinde DynamicTypeSize’ı destekleyerek kenar boşluklarını ve düzeni uyarlamaya olanak tanır.

Büyük Yazı Tipleri İçin Düzen Uyarlaması

Auto Layout, Dynamic Type desteği için bir ön koşuldur. Sabit genişlikler ve yükseklikler (>=, <=) erişilebilirlik boyutlarında bozulur. UILabel için intrinsicContentSize kullanın — geçerli yazı tipi boyutu için yüksekliği otomatik olarak hesaplar.

Uyarlanabilir düzen kuralları:

  • distribution = fill ve spacing >= 8 ile UIStackView — öğeler bir sonraki satıra kaydırılır
  • automaticDimension ile UITableViewCell — hücre yüksekliği içeriğe göre ayarlanır
  • UILabel’da numberOfLines = 0 — metin kesilmez, sarılır
  • edgeInsets ile düğmeler — traitCollection.preferredContentSizeCategory aracılığıyla erişilebilirlik seviyelerinde kenar boşluğu ekleyin

Uzun metinler için (örn. makaleler, kullanım koşulları), UILabel’da minimumScaleFactor ayarlayın — Auto Layout içeriği sığdıramadığında son çare olarak metni küçültür. 0.5 değeri, yazı tipinin tercih edilen boyutun %50’sine kadar küçülebileceği anlamına gelir.

Boyut kategorisine göre kenar boşluğu ayarlama örneği:

swift
let isAccessibility = traitCollection
    .preferredContentSizeCategory.isAccessibilityCategory
stackView.spacing = isAccessibility ? 16 : 8
button.contentEdgeInsets = isAccessibility
    ? UIEdgeInsets(top: 16, left: 24, bottom: 16, right: 24)
    : UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)

Erişilebilirlik Seviyelerinde Tipik Düzen Sorunları

Metin kesilmesi — numberOfLines = 1 ve sabit genişlikte UILabel, AccessibilityXL’de metni keser. Çözüm: numberOfLines = 0 ve trailing kısıtlaması. Öğe çakışması — sabit yükseklikteki düğmeler üst üste biner. Çözüm: otomatik aralıklı UIStackView. Ekran dışına taşan içerik — erişilebilirlik seviyeleri için ScrollView zorunludur.

Dynamic Type Test Etme

Xcode Simulator, metin boyutunu değiştirmenize olanak tanır: simulator menüsünde Settings → Accessibility → Display & Text Size → Larger Text’e gidin. 11 seviyenin tümü arasında geçiş yapın ve metnin kesilmediğini, düğmelerin erişilebilir olduğunu ve düzenin bozulmadığını doğrulayın.

Otomatik testler için XCUIApplication’da contentSizeCategory ayarını kullanın:

swift
func testAccessibilitySizes() {
    let app = XCUIApplication()
    app.launchArguments += [
        "-UIPreferredContentSizeCategoryName",
        "UICTContentSizeCategoryAccessibilityXXXL"
    ]
    app.launch()
    app.scrollViews.buttons["Gönder"].tap()
    XCTAssertTrue(app.staticTexts["Form gönderildi"]
        .waitForExistence(timeout: 5))
}

Farklı launchArguments ile XCUITest, CI’da tüm ölçekleme seviyelerini kontrol etmenizi sağlar. Erişilebilirlik kategorilerini ayrı ayrı test etmeyi unutmayın — düzeni en çok bozanlar bunlardır. Apple’a göre Dynamic Type hatalarının %70’i özellikle erişilebilirlik seviyelerinde bulunur, çünkü geliştiriciler yalnızca standart boyutları test eder.

Accessibility Inspector: Dynamic Type Kontrolü

Xcode Accessibility Inspector, seçilen öğenin hangi yazı tiplerini kullandığını gösterir — sabit veya ölçeklenebilir. Öğe, simülatörde metin boyutu değişikliklerine yanıt vermiyorsa, sabit bir yazı tipi kullanılıyordur. Bunu UIFont.preferredFont veya UIFontMetrics ile değiştirin.

Sıkça Sorulan Sorular

Basitçe ifade etmek gerekirse iOS’ta Dynamic Type nedir?

Sistem boyut ayarlarına göre bir uygulamada otomatik metin ölçeklemesidir. Kullanıcı Ayarlar’da boyutu değiştirir — desteklenen tüm uygulamalar geliştirici müdahalesi olmadan uyum sağlar.

Dynamic Type yalnızca sistem yazı tipleriyle mi çalışır?

Hayır. Özel yazı tipleri için UIFontMetrics(scaledFont:) kullanın. Bu yöntem, herhangi bir yazı tipini belirtilen metin stiline göre ölçekleyerek oranları korur.

iOS kaç ölçekleme seviyesini destekler?

11 seviye: 5 standart (XS, S, M, L, XL) ve 6 erişilebilirlik seviyesi (AccessibilityXL’den AccessibilityXXXXXL’ye kadar). Body yazı tipi boyutu 14px ile 53px arasında değişebilir.

Metin boyutu değişikliklerine nasıl abone olunur?

UIKit’te UIContentSizeCategory.didChangeNotification aracılığıyla. SwiftUI’da @Environment(\.dynamicTypeSize) kullanın — sistem ayarı değiştiğinde görünüm otomatik olarak güncellenir.

Dynamic Type desteklenmezse ne olur?

Yazı tipini büyüten kullanıcılar kesilmiş metin, üst üste binen öğeler ve bozuk düğmeler görür. Uygulama, erişilebilirlik gereksinimlerini ihlal ettiği için App Store incelemesinde reddedilebilir.

Özet

  • Dynamic Type — metni sistem ayarlarına göre ölçekleyen yerleşik iOS mekanizması; App Store için zorunlu
  • Sistem yazı tipleri için UIFont.preferredFont(forTextStyle:) ve özel yazı tipleri için UIFontMetrics kullanın
  • iOS, XS’den AccessibilityXXXXXL’ye kadar 11 seviye ölçeklemeyi destekler (body için 14–53px)
  • SwiftUI’da Dynamic Type, .font(.body) ve @Environment(\.dynamicTypeSize) aracılığıyla otomatik çalışır
  • Düzen uyarlanabilir olmalıdır: UIStackView, tablolarda automaticDimension, numberOfLines = 0
  • 11 seviyenin tümünü test edin, özellikle erişilebilirlik kategorilerini — düzenlerin %70’i bunlarda bozulur
  • UIKit uygulamaları için UIContentSizeCategory.didChangeNotification aboneliği zorunludur

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun