Wichtige Punkte
Dynamic Type ist eine Apple-Technologie, die es ermöglicht, dass Schriftarten in einer App automatisch skaliert werden, wenn sich die Systemtextgröße ändert. Der Benutzer stellt seine bevorzugte Größe in Einstellungen → Bedienungshilfen → Anzeige & Textgröße ein, und alle Apps, die Dynamic Type unterstützen, passen die Schriftgröße ohne Neustart an.
Das System bietet 11 Skalierungsstufen: von XS (14pt Basis) bis XXXL (23pt Basis) sowie 5 zusätzliche Barrierefreiheitsgrößen (AX1–AX5) für Benutzer mit starken Sehbehinderungen. Bei einer Größenänderung generiert iOS eine UIContentSizeCategory.didChangeNotification, und die App muss die Schriftarten über UIFontMetrics neu laden. Laut den Apple Human Interface Guidelines ändert Dynamic Type weder den Zeilenabstand noch die Buchstabenproportionen — nur die Schriftgröße, wodurch die Lesbarkeit bei allen Größen erhalten bleibt.
Dynamic Type ist für Apps, die den Barrierefreiheitsstatus anstreben, verpflichtend. Auf der WWDC 2024 gab Apple bekannt, dass Apps ohne dynamische Typunterstützung bei der Überprüfung abgelehnt werden können, wenn ihre Kernfunktionalität das Lesen von Text betrifft. In IT-Sectr-Projekten implementieren wir Dynamic Type ab der ersten Version — das spart bis zu 20% Zeit bei der späteren Barrierefreiheitsanpassung.
Apple bietet 11 vordefinierte Textstile, die jeweils über UIFontDescriptor.UIAttributes für die Systemschriftart SF Pro dargestellt werden. Der Entwickler gibt keine Pixelgröße vor — er wählt einen semantischen Stil, und iOS wendet die tatsächliche Schriftgröße basierend auf den Benutzereinstellungen an.
| Stil | Größe (Standard) | Größe (AX5) | Verwendung |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Bildschirmtitel der ersten Ebene |
| .title1 | 28pt | 50pt | Sekundäre Überschriften |
| .title2 | 22pt | 40pt | Abschnittsüberschriften |
| .title3 | 20pt | 36pt | Unterüberschriften |
| .headline | 17pt semibold | 31pt | Hervorgehobener Text in Listen |
| .body | 17pt | 31pt | Fließtext |
| .callout | 16pt | 29pt | Callouts und ergänzender Text |
| .subheadline | 15pt | 27pt | Elementbeschriftungen |
| .footnote | 13pt | 23pt | Fußnoten und kleiner Text |
| .caption1 | 12pt | 21pt | Bildunterschriften |
| .caption2 | 11pt | 19pt | Etiketten und kleine Beschriftungen |
Jeder Stil verwendet die Systemschriftart SF Pro mit einer festen Schriftstärke (Regular für body, Bold für headline). Benutzerdefinierte Schriftarten werden über UIFontMetrics angebunden — die einzig korrekte Methode, um eine Drittanbieter-Schriftart an den dynamischen Typ anzupassen.
UIFontMetrics ist eine in iOS 11 eingeführte Klasse, die eine beliebige UIFont proportional zum ausgewählten Textstil skaliert. Vor iOS 11 verwendeten Entwickler einen direkten Aufruf von preferredFontForTextStyle, der nur die Systemschriftart SF Pro zurückgibt. UIFontMetrics löst dieses Problem: Es nimmt jede Schriftart entgegen und gibt ihre skalierte Version zurück, wobei Schriftstärke und Proportionen erhalten bleiben.
Die Methode scaledFont(for:) berechnet einen Skalierungsfaktor basierend auf der aktuellen Textgröße des Benutzers: Wenn Groß ausgewählt ist, beträgt der Faktor 1,0; bei Sehr Groß (AX1) — etwa 1,3; bei Maximum (AX5) — bis zu 1,8. Der Faktor wird auf die Basisgröße der benutzerdefinierten Schriftart angewendet, nicht auf die Systemschrift — dies stellt sicher, dass die Designintention bei allen Größen erhalten bleibt.
UIFontMetrics wird für alle benutzerdefinierten Schriftarten in einer App empfohlen. Auf der WWDC 2024 zeigte Apple das Tool Accessibility Inspector, das die Dynamic-Type-Unterstützung überprüft und Elemente hervorhebt, die eine feste Schriftgröße anstelle von UIFontMetrics verwenden. Bei IT Sectr haben wir UIFontMetrics seit 2018 in allen Projekten implementiert — dies reduzierte Textüberlappungsfehler um 35%.
Der einfachste Weg, eine dynamische Schriftart für ein Label zu erhalten. Der Code zeigt, wie man ein UILabel mit dem .body-Stil einrichtet, das automatisch auf Änderungen der Systemtextgröße reagiert.
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),
])
}
}
Das Flag adjustsFontForContentSizeCategory = true aktualisiert die Schriftart automatisch, wenn sich die Systemtextgröße ändert — ohne dieses Flag funktioniert Dynamic Type für ein vorhandenes Label nicht. Bei einer Größenänderung ruft iOS layoutIfNeeded auf, und das Label aktualisiert die Schriftart ohne manuelles Eingreifen.
Bei Verwendung einer benutzerdefinierten Schriftart (z. B. Montserrat) gibt der Aufruf von preferredFontForTextStyle SF Pro zurück, nicht Ihre Schriftart. UIFontMetrics skaliert speziell die benutzerdefinierte Schriftart und bewahrt ihr Design.
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
)
Die Methode scaledFont(for:) nimmt eine Basis-UIFont entgegen und gibt eine skalierte Version proportional zum .title3-Stil zurück. Bei der Barrierefreiheitsgröße AX5 wird die Schriftart Montserrat-Bold 20pt zu ~36pt — genauso stark, wie die Systemschriftart dieses Stils zunehmen würde. Bei IT Sectr verwenden wir dieses Muster seit 2018 in allen Projekten mit benutzerdefinierten Schriftarten, was Beschwerden über kleine Schriftarten von Benutzern mit Sehbehinderungen vollständig beseitigt hat.
Wenn Sie die Schriftart manuell aktualisieren (ohne adjustsFontForContentSizeCategory), abonnieren Sie die Benachrichtigung UIContentSizeCategory.didChangeNotification. Dies ist für benutzerdefinierte UI-Elemente erforderlich, die keine automatische Schriftartaktualisierung erben.
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)
}
}
Das Abonnieren von didChangeNotification stellt sicher, dass das benutzerdefinierte Element seine Schriftart aktualisiert, wenn sich die Systemeinstellungen ändern, ohne dass die App neu gestartet werden muss. Seit iOS 15 trifft die Benachrichtigung sogar ein, wenn die Textgröße über das Kontrollzentrum in Apps geändert wird, die Live Text Size unterstützen.
Häufig gestellte Fragen
Dynamic Type ist auf iOS 7 und neuer verfügbar. UIFontMetrics erschien in iOS 11 — davor wurde die Methode preferredFontForTextStyle direkt verwendet. Unter iOS 15+ unterstützt der dynamische Typ zusätzliche Barrierefreiheitsgrößen (AX1–AX5) für große Schriftarten. Apps, die iOS 10 und älter unterstützen, verwenden preferredFontForTextStyle ohne UIFontMetrics, was die Unterstützung nur auf die Systemschriftart SF Pro beschränkt.
Öffnen Sie in Xcode 15+ den Simulator und wählen Sie Einstellungen → Bedienungshilfen → Anzeige & Textgröße → Größerer Text. Ziehen Sie den Schieberegler, um die Größe zu ändern. In Xcode selbst gibt es Debug → Accessibility Inspector, der Elemente mit fester Schriftart hervorhebt. Verwenden Sie für die Automatisierung einen Test, der die UISlider-Einstellungen über XCUITest ändert — dies stellt sicher, dass alle Bildschirme korrekt neu aufgebaut werden.
Ja, Auto Layout mit dynamischem Typ erfordert die Verwendung von intrinsicContentSize bei UILabel und UIButton. Bei Barrierefreiheitsgrößen kann Text über die Grenzen der Superview hinausragen — fügen Sie UIScrollView hinzu oder erhöhen Sie die leading/trailing-Constraints. Verwenden Sie UIFontMetrics.scaledValue für Abstände, damit auch der Buchstabenabstand proportional zur Schriftart skaliert wird.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch