Önemli Noktalar
Dynamic Type, sistem metin boyutu değiştiğinde uygulama yazı tiplerinin otomatik olarak ölçeklenmesini sağlayan bir Apple teknolojisidir. Kullanıcı, Ayarlar → Erişilebilirlik → Ekran ve Metin Boyutu'nda tercih ettiği boyutu belirler ve Dynamic Type'ı destekleyen tüm uygulamalar, yeniden başlatmadan yazı tipi boyutunu uyarlar.
Sistem 11 ölçekleme seviyesi sunar: XS'den (14pt taban) XXXL'ye (23pt taban) ve ayrıca ciddi görme engelli kullanıcılar için 5 ek erişilebilirlik boyutu (AX1–AX5). Boyut değiştiğinde, iOS bir UIContentSizeCategory.didChangeNotification bildirimi oluşturur ve uygulamanın UIFontMetrics aracılığıyla yazı tiplerini yeniden yüklemesi gerekir. Apple Human Interface Guidelines'a göre Dynamic Type, satır aralığını veya harf oranlarını değiştirmez — yalnızca yazı tipi boyutunu değiştirerek tüm boyutlarda okunabilirliği korur.
Dynamic Type, erişilebilirlik durumunu hedefleyen uygulamalar için zorunludur. WWDC 2024'te Apple, dinamik tip desteği olmayan uygulamaların, temel işlevleri metin okumayla ilgiliyse inceleme sırasında reddedilme riskiyle karşı karşıya olduğunu duyurdu. IT Sectr projelerinde, Dynamic Type'ı ilk sürümden itibaren uyguluyoruz — bu, sonraki erişilebilirlik uyarlamasında %20'ye varan zaman tasarrufu sağlar.
Apple, sistem yazı tipi SF Pro için UIFontDescriptor.UIAttributes aracılığıyla 11 ön tanımlı metin stili sağlar. Geliştirici piksel boyutu belirtmez — anlamsal bir stil seçer ve iOS, kullanıcı ayarlarına göre gerçek yazı tipi boyutunu uygular.
| Stil | Boyut (varsayılan) | Boyut (AX5) | Kullanım |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Birinci düzey ekran başlıkları |
| .title1 | 28pt | 50pt | İkincil başlıklar |
| .title2 | 22pt | 40pt | Bölüm başlıkları |
| .title3 | 20pt | 36pt | Alt başlıklar |
| .headline | 17pt semibold | 31pt | Listelerde vurgulanan metin |
| .body | 17pt | 31pt | Gövde metni |
| .callout | 16pt | 29pt | Belirteçler ve tamamlayıcı metin |
| .subheadline | 15pt | 27pt | Öğe etiketleri |
| .footnote | 13pt | 23pt | Dipnotlar ve küçük metin |
| .caption1 | 12pt | 21pt | Görsel altyazıları |
| .caption2 | 11pt | 19pt | Etiketler ve küçük altyazılar |
Her stil, sabit ağırlıkta sistem yazı tipi SF Pro'yu kullanır (body için Regular, headline için Bold). Özel yazı tipleri UIFontMetrics aracılığıyla bağlanır — üçüncü taraf bir yazı tipini dinamik tipe uyarlamanın tek doğru yolu.
UIFontMetrics, iOS 11'de tanıtılan ve rastgele bir UIFont'u seçilen metin stiline orantılı olarak ölçekleyen bir sınıftır. iOS 11'den önce geliştiriciler, yalnızca sistem yazı tipi SF Pro'yu döndüren preferredFontForTextStyle'ı doğrudan kullanıyordu. UIFontMetrics bu sorunu çözer: herhangi bir yazı tipini alır ve ağırlığı ve oranları koruyarak ölçeklenmiş sürümünü döndürür.
scaledFont(for:) yöntemi, kullanıcının mevcut metin boyutuna göre bir ölçekleme faktörü hesaplar: Büyük seçilirse faktör 1.0; Çok Büyük (AX1) ise — yaklaşık 1.3; Maksimum (AX5) için — 1.8'e kadar. Faktör, sistem yazı tipine değil, özel yazı tipinin taban boyutuna uygulanır — bu, tasarımcının niyetinin tüm boyutlarda korunmasını sağlar.
UIFontMetrics, bir uygulamadaki tüm özel yazı tipleri için önerilir. WWDC 2024'te Apple, Dynamic Type desteğini kontrol eden ve UIFontMetrics yerine sabit yazı tipi boyutu kullanan öğeleri vurgulayan Accessibility Inspector aracını gösterdi. IT Sectr'da, 2018'den beri tüm projelerde UIFontMetrics'ı uyguladık — bu, metin çakışması hatalarını %35 azalttı.
Bir etiket için dinamik yazı tipi almanın en basit yolu. Kod, sistem metin boyutundaki değişikliklere otomatik olarak yanıt veren .body stiline sahip bir UILabel'in nasıl ayarlanacağını gösterir.
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),
])
}
}
adjustsFontForContentSizeCategory = true bayrağı, sistem metin boyutu değiştiğinde yazı tipini otomatik olarak günceller — bu bayrak olmadan Dynamic Type mevcut bir etiket için çalışmaz. Boyut değiştiğinde, iOS layoutIfNeeded'ı çağırır ve etiket manuel müdahale olmadan yazı tipini günceller.
Özel bir yazı tipi (örneğin Montserrat) kullanırken preferredFontForTextStyle'ı çağırmak SF Pro'yu döndürür, sizin yazı tipinizi değil. UIFontMetrics, özel yazı tipini özel olarak ölçekleyerek tasarımını korur.
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
)
scaledFont(for:) yöntemi, bir temel UIFont alır ve .title3 stiliyle orantılı ölçeklenmiş bir sürüm döndürür. Erişilebilirlik boyutu AX5'te, Montserrat-Bold 20pt yazı tipi ~36pt olur — bu stilin sistem yazı tipinin artacağı miktarla tam olarak aynı. IT Sectr'da, 2018'den beri özel yazı tipleri olan tüm projelerde bu deseni kullandık ve görme engelli kullanıcılardan gelen küçük metin şikayetlerini tamamen ortadan kaldırdık.
Yazı tipini manuel olarak güncellerseniz (adjustsFontForContentSizeCategory olmadan), UIContentSizeCategory.didChangeNotification bildirimine abone olun. Bu, otomatik yazı tipi güncellemesini miras almayan özel UI öğeleri için gereklidir.
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)
}
}
didChangeNotification'a abone olmak, uygulamayı yeniden başlatmadan sistem ayarları her değiştiğinde özel öğenin yazı tipini güncellemesini sağlar. iOS 15'ten itibaren, Live Text Size'ı destekleyen uygulamalarda Kontrol Merkezi aracılığıyla metin boyutu değiştirildiğinde bile bildirim gelir.
Sıkça Sorulan Sorular
Dynamic Type, iOS 7 ve sonraki sürümlerde kullanılabilir. UIFontMetrics iOS 11'de ortaya çıktı — ondan önce preferredFontForTextStyle yöntemi doğrudan kullanılıyordu. iOS 15+'ta, dinamik tip büyük yazı tipleri için ek erişilebilirlik boyutlarını (AX1–AX5) destekler. iOS 10 ve altını destekleyen uygulamalar, UIFontMetrics olmadan preferredFontForTextStyle kullanır ve bu da desteği yalnızca sistem yazı tipi SF Pro ile sınırlar.
Xcode 15+'ta simülatörü açın ve Ayarlar → Erişilebilirlik → Ekran ve Metin Boyutu → Daha Büyük Metin'e gidin. Boyutu değiştirmek için kaydırıcıyı sürükleyin. Xcode'un kendisinde, sabit yazı tipine sahip öğeleri vurgulayan Debug → Accessibility Inspector bulunur. Otomasyon için, XCUITest aracılığıyla UISlider ayarlarını değiştiren bir test kullanın — bu, tüm ekranların doğru şekilde yeniden oluşturulmasını sağlar.
Evet, dinamik tip ile Auto Layout, UILabel ve UIButton'da intrinsicContentSize kullanımını gerektirir. Erişilebilirlik boyutlarında, metin superview sınırlarını aşabilir — UIScrollView ekleyin veya leading/trailing kısıtlamalarını artırın. Dolgu için UIFontMetrics.scaledValue kullanın, böylece harf aralığı da yazı tipiyle orantılı olarak ölçeklenir.
Ö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