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, 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, 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.
iOS, varsayılan ayar için 8 metin stili sağlar, her biri önceden tanımlanmış boyut ve kalınlığa sahiptir:
| Stil | Sabit | Boyut (L) | Amaç |
|---|---|---|---|
| Large Title | .largeTitle | 34px | Ekran ana başlığı |
| Title 1 | .title1 | 28px | Bölüm başlığı |
| Title 2 | .title2 | 22px | Alt başlık |
| Title 3 | .title3 | 20px | Kart başlığı |
| Headline | .headline | 17px (kalın) | Vurgu için kalın |
| Body | .body | 17px | Ana metin |
| Callout | .callout | 16px | Tamamlayıcı metin |
| Caption 1 | .caption1 | 12px | Görsel alt yazısı |
| Caption 2 | .caption2 | 11px | Küçük alt yazı |
| Footnote | .footnote | 13px | Dipnot, 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.
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.
iOS, metin ölçeklemenin 11 seviyesini destekler, iki kategoriye ayrılmıştır:
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:
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
// Alternatif düzeni etkinleştir
}
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 temel uygulama — UIFont.preferredFont(forTextStyle:). Bu yöntem, geçerli sistem ayarına göre ölçeklenmiş bir yazı tipi döndürür:
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)
Özel yazı tipleri için UIFontMetrics kullanın:
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, 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 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:
Text("Ana metin")
.font(.body)
.lineLimit(nil)
.minimumScaleFactor(0.5)
Özel ölçekler için DynamicTypeSize kullanın:
@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.
.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.
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ı:
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:
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)
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.
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:
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.
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
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.
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.
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.
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.
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
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.
Ayrıca okuyun