Dynamic Type ist eine integrierte iOS-Funktion, die die Schriftgröße in einer App automatisch an die Systemeinstellungen des Benutzers anpasst. Der Benutzer stellt die bevorzugte Textgröße in Einstellungen → Bildschirm und Helligkeit → Textgröße ein, und alle Apps, die Dynamic Type unterstützen, passen sich ohne zusätzliche Aktionen an. Laut den Apple Human Interface Guidelines, 2024 ist die Unterstützung von Dynamic Type eine zwingende Voraussetzung für die Veröffentlichung im App Store, da es ein grundlegendes Element der Barrierefreiheit auf der iOS-Plattform ist.
Wichtige Punkte
Dynamic Type ist eine iOS-Technologie, die in iOS 7 eingeführt wurde und es Text in einer App ermöglicht, sich automatisch an die System-Schriftgrößeneinstellungen anzupassen. Der Benutzer kann die Schrift in allen Apps gleichzeitig vergrößern oder verkleinern — ohne die Einstellungen in jeder einzelnen App ändern zu müssen.
Laut Apple WWDC 2023, „Make Your App Visually Accessible“ ändern über 40% der iOS-Benutzer die Schriftgröße gegenüber der Standardeinstellung. In der Altersgruppe 65+ erreicht dieser Wert 70%. Dynamic Type ist eine zwingende Voraussetzung für die Barrierefreiheitszertifizierung im App Store. Fehlende Unterstützung ist ein Grund für die Ablehnung der App während der Prüfung.
Funktionsweise: Die App verwendet UIFont.preferredFont(forTextStyle:) anstelle von UIFont(name:size:). iOS gibt automatisch eine Schrift zurück, die entsprechend der aktuellen Systemeinstellung skaliert wurde. Wenn die Größe in den Einstellungen geändert wird, generiert iOS eine Benachrichtigung UIContentSizeCategory.didChangeNotification — die App muss das Layout neu berechnen.
Dynamic Type erschien in iOS 7 zusammen mit dem flachen Design. iOS 10 fügte Unterstützung für benutzerdefinierte Schriften über UIFontMetrics hinzu. iOS 11 führte Barrierefreiheitsstufen (bis AccessibilityXXXL) ein. iOS 15 fügte Dynamic Type in SwiftUI mit automatischer Unterstützung hinzu. Mit jedem Release verschärft Apple die Anforderungen: Ab iOS 17 erhalten Apps ohne Dynamic Type-Unterstützung eine Warnung beim Hochladen in App Store Connect.
iOS stellt 8 Textstile bereit, jeder mit einer vordefinierten Größe und Schriftstärke für die Standardeinstellung:
| Stil | Konstante | Größe (L) | Verwendung |
|---|---|---|---|
| Large Title | .largeTitle | 34px | Haupttitel des Bildschirms |
| Title 1 | .title1 | 28px | Abschnittsüberschrift |
| Title 2 | .title2 | 22px | Unterüberschrift |
| Title 3 | .title3 | 20px | Kartentitel |
| Headline | .headline | 17px (fett) | Fettdruck für Hervorhebung |
| Body | .body | 17px | Haupttext |
| Callout | .callout | 16px | Ergänzungstext |
| Caption 1 | .caption1 | 12px | Bildunterschrift |
| Caption 2 | .caption2 | 11px | Kleine Bildunterschrift |
| Footnote | .footnote | 13px | Fußnote, Anmerkung |
Den richtigen Stil zu verwenden, ist nicht nur eine Frage des „Aussehens“. UIFont.TextStyle.body kann im AccessibilityXXXL-Modus 53px erreichen. Wenn eine App eine feste Schriftgröße von 17px für Body verwendet, wird der Text für Benutzer, die die Schrift vergrößert haben, unlesbar.
Dynamic Type skaliert nicht nur — es bewahrt die visuelle Hierarchie. Large Title ist immer größer als Title 1, der größer als Body ist, unabhängig von der Skalierungsstufe. Die Skalierungskoeffizienten unterscheiden sich: Überschriften werden aggressiver skaliert als der Haupttext, damit die Hierarchie auch auf Barrierefreiheitsstufen erhalten bleibt.
iOS unterstützt 11 Stufen der Textskalierung, unterteilt in zwei Kategorien:
Der Unterschied zwischen XS und AccessibilityXXXL für den body-Stil reicht von 14px bis 53px — fast Faktor 4×. Ein für 17px ausgelegtes Layout bricht bei 53px vollständig: Text überläuft, Schaltflächen überlappen sich, Zellen kollidieren.
Aktuelle Kategorie im Code prüfen:
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
// Alternative Layout aktivieren
}
Die Textgrößenkategorie ist über traitCollection.uiContentSizeCategory verfügbar. Wenn die Systemeinstellung geändert wird, ruft iOS traitCollectionDidChange auf allen UIView auf. In dieser Methode müssen Sie die Schriften aktualisieren und das Layout neu berechnen. SwiftUI erledigt dies automatisch — UIKit erfordert manuelles Abonnement.
Für UICollectionView verwenden Sie UICollectionViewCompositionalLayout — es passt die Anzahl der Spalten automatisch an die Bildschirmbreite und Textgröße an. Wechseln Sie auf Barrierefreiheitsstufen von einem zweispaltigen zu einem einspaltigen Layout, damit Text nicht abgeschnitten wird und Elemente nicht überlappen. Verwenden Sie bedingtes Layout: für reguläre Breite — zwei Spalten, für kompakte oder Barrierefreiheit — eine Spalte.
Basisimplementierung in UIKit — UIFont.preferredFont(forTextStyle:). Diese Methode gibt eine entsprechend der aktuellen Systemeinstellung skalierte Schrift zurück:
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)
Für benutzerdefinierte Schriften verwenden Sie UIFontMetrics:
let customFont = UIFont(name: "Montserrat-Regular", size: 16)!
titleLabel.font = UIFontMetrics(forTextStyle: .body)
.scaledFont(for: customFont)
// Überwachung von Größenänderungen
NotificationCenter.default.addObserver(
self,
selector: #selector(preferredContentSizeChanged),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
Für UILabel im Interface Builder reicht es, die Schrift als Textstil festzulegen und „Automatically Adjusts Font“ zu aktivieren. Für benutzerdefinierte Schriften unterstützt Interface Builder UIFontMetrics nicht — nur über Code.
UIFontMetrics verwendet dieselbe Skalierungskurve wie preferredFont. Sie können fromTextStyle: .body, .headline usw. angeben. Jeder Stil hat seinen eigenen Skalierungskoeffizienten. Body skaliert moderat, Large Title skaliert aggressiv. Wenn Ihre benutzerdefinierte Schrift für den Haupttext verwendet wird, verwenden Sie .body.
In SwiftUI ist die Dynamic Type-Unterstützung standardmäßig integriert. Alle Systemmodifikatoren (.font(.body), .font(.title)) skalieren automatisch. Der Entwickler muss UIFont.preferredFont nicht aufrufen.
Beispiel:
Text("Haupttext")
.font(.body)
.lineLimit(nil)
.minimumScaleFactor(0.5)
Für benutzerdefinierte Skalierungen verwenden Sie DynamicTypeSize:
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
Text("Adaptiver Text")
.font(.body)
.padding(dynamicTypeSize <= .large ? 8 : 16)
}
SwiftUI aktualisiert die Ansicht automatisch, wenn sich die Systemtextgröße ändert — keine zusätzlichen Benachrichtigungsabonnements erforderlich.
Der Modifikator .font(.body) funktioniert nur für die Systemschrift. Für benutzerdefinierte Schriften in SwiftUI verwenden Sie Font.custom mit UIFontMetrics im Hintergrund. Ab iOS 16 unterstützt SwiftUI DynamicTypeSize in @Environment, was die Anpassung von Abständen und Layout ermöglicht.
Auto Layout ist eine Voraussetzung für die Dynamic Type-Unterstützung. Feste Breiten und Höhen (>=, <=) brechen bei Barrierefreiheitsgrößen. Verwenden Sie intrinsicContentSize für UILabel — es berechnet die Höhe automatisch für die aktuelle Schriftgröße.
Regeln für adaptives Layout:
Für lange Texte (z. B. Artikel, Nutzungsbedingungen) setzen Sie minimumScaleFactor auf UILabel — dies verkleinert den Text als letzten Ausweg, wenn Auto Layout den Inhalt nicht aufnehmen kann. Ein Wert von 0.5 bedeutet, dass die Schrift auf 50% der bevorzugten Größe schrumpfen kann.
Beispiel für die Anpassung von Abständen an die Größenkategorie:
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)
Textabschneidung — UILabel mit numberOfLines = 1 und fester Breite schneidet Text auf AccessibilityXL ab. Lösung: numberOfLines = 0 und trailing-Constraint. Überlappung von Elementen — Schaltflächen mit fester Höhe überlappen sich. Lösung: UIStackView mit automatischem Abstand. Inhalt außerhalb des Bildschirms — ScrollView ist für Barrierefreiheitsstufen obligatorisch.
Der Xcode-Simulator ermöglicht die Änderung der Textgröße: Gehen Sie im Simulator-Menü zu Settings → Accessibility → Display & Text Size → Larger Text. Wechseln Sie zwischen allen 11 Stufen und überprüfen Sie, ob Text nicht abgeschnitten wird, Schaltflächen zugänglich sind und das Layout nicht bricht.
Für automatisierte Tests verwenden Sie die contentSizeCategory-Einstellung in XCUIApplication:
func testAccessibilitySizes() {
let app = XCUIApplication()
app.launchArguments += [
"-UIPreferredContentSizeCategoryName",
"UICTContentSizeCategoryAccessibilityXXXL"
]
app.launch()
app.scrollViews.buttons["Senden"].tap()
XCTAssertTrue(app.staticTexts["Formular gesendet"]
.waitForExistence(timeout: 5))
}
XCUITest mit verschiedenen launchArguments ermöglicht die Überprüfung aller Skalierungsstufen im CI. Vergessen Sie nicht, die Barrierefreiheitskategorien separat zu testen — sie brechen am häufigsten das Layout. Laut Apple werden 70% der Dynamic Type-Fehler speziell auf Barrierefreiheitsstufen gefunden, weil Entwickler nur Standardgrößen testen.
Xcode Accessibility Inspector zeigt, welche Schriften das ausgewählte Element verwendet — fest oder skalierbar. Wenn das Element nicht auf Textgrößenänderungen im Simulator reagiert, wird eine feste Schrift verwendet. Ersetzen Sie sie durch UIFont.preferredFont oder UIFontMetrics.
Häufig gestellte Fragen
Es ist die automatische Textskalierung in einer App entsprechend den Systemgrößeneinstellungen. Der Benutzer ändert die Größe in den Einstellungen — alle unterstützenden Apps passen sich ohne Eingriff des Entwicklers an.
Nein. Für benutzerdefinierte Schriften verwenden Sie UIFontMetrics(scaledFont:). Diese Methode skaliert jede Schrift relativ zum angegebenen Textstil und bewahrt die Proportionen.
11 Stufen: 5 Standard (XS, S, M, L, XL) und 6 Barrierefreiheitsstufen (von AccessibilityXL bis AccessibilityXXXXXL). Die body-Schriftgröße kann von 14px bis 53px reichen.
In UIKit über UIContentSizeCategory.didChangeNotification. In SwiftUI verwenden Sie @Environment(\.dynamicTypeSize) — die Ansicht wird automatisch aktualisiert, wenn sich die Systemeinstellung ändert.
Benutzer mit vergrößerter Schrift sehen abgeschnittenen Text, überlappende Elemente und defekte Schaltflächen. Die App kann bei der App Store-Prüfung wegen Verstoßes gegen Barrierefreiheitsanforderungen abgelehnt werden.
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