Dynamic Type är en inbyggd iOS-funktion som automatiskt ändrar teckenstorleken i applikationen enligt användarens systeminställningar. Användaren ställer in önskad textstorlek i Inställningar → Skärm och ljusstyrka → Textstorlek, och alla applikationer som stöder Dynamic Type anpassar sig utan ytterligare åtgärder. Enligt Apple Human Interface Guidelines, 2024 är stöd för Dynamic Type ett obligatoriskt krav för publicering i App Store, eftersom det är en grundläggande komponent för tillgänglighet på iOS-plattformen.
Huvudpunkter
Dynamic Type är en iOS-teknik som introducerades i iOS 7 och som gör att text i applikationen automatiskt kan anpassas till systemets teckenstorleksinställningar. Användaren kan öka eller minska teckensnittet i alla applikationer samtidigt — utan att behöva ändra inställningar i varje applikation separat.
Enligt Apple WWDC 2023, ”Make Your App Visually Accessible” ändrar över 40 % av iOS-användarna teckenstorleken från standardinställningen. För åldersgruppen 65+ når denna siffra 70 %. Dynamic Type är ett obligatoriskt krav för tillgänglighetscertifiering i App Store. Brist på stöd är en anledning till att applikationen avvisas vid granskning.
Funktionsprincip: applikationen använder UIFont.preferredFont(forTextStyle:) istället för UIFont(name:size:). iOS returnerar automatiskt ett teckensnitt skalat enligt aktuell systeminställning. När storleken ändras i inställningarna genererar iOS ett meddelande UIContentSizeCategory.didChangeNotification — applikationen måste beräkna layouten på nytt.
Dynamic Type dök upp i iOS 7 tillsammans med platt design. I iOS 10 lades stöd för anpassade teckensnitt till via UIFontMetrics. iOS 11 introducerade tillgänglighetsnivåer (upp till AccessibilityXXXL). iOS 15 lade till Dynamic Type i SwiftUI med automatiskt stöd. Med varje release skärper Apple kraven: från och med iOS 17 får applikationer utan Dynamic Type-stöd en varning vid uppladdning till App Store Connect.
iOS tillhandahåller 8 textstilar, var och en med fördefinierad storlek och stil för standardinställningen:
| Stil | Konstant | Storlek (L) | Användning |
|---|---|---|---|
| Large Title | .largeTitle | 34px | Huvudrubrik på skärmen |
| Title 1 | .title1 | 28px | Avsnittsrubrik |
| Title 2 | .title2 | 22px | Underrubrik |
| Title 3 | .title3 | 20px | Kortrubrik |
| Headline | .headline | 17px (bold) | Fetstil för betoning |
| Body | .body | 17px | Brödtext |
| Callout | .callout | 16px | Hjälptext |
| Caption 1 | .caption1 | 12px | Bildtext under bild |
| Caption 2 | .caption2 | 11px | Liten bildtext |
| Footnote | .footnote | 13px | Fotnot, anmärkning |
Att använda rätt stil är inte bara en fråga om utseende. UIFont.TextStyle.body i AccessibilityXXXL-läge kan nå 53px. Om applikationen använder fast teckensnitt 17px för body blir texten oläslig för användare som har ökat teckensnittet.
Dynamic Type skal inte bara — det bevarar den visuella hierarkin. Large Title är alltid större än Title 1, som är större än Body, oavsett skalningsnivå. Skalningskoefficienterna varierar: rubriker skalas mer aggressivt än brödtext, så att hierarkin bevaras även på tillgänglighetsnivåer.
iOS stöder 11 nivåer av textskalning, indelade i två kategorier:
Skillnaden mellan XS och AccessibilityXXXL för body-stilen är från 14px till 53px — nästan 4×. Layout designad för 17px kollapsar helt vid 53px: text går utanför gränser, knappar överlappar, celler krockar med varandra.
Kontrollera aktuell kategori i koden:
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
// Aktivera alternativ layout
}
Textstorlekskategorin är tillgänglig via traitCollection.uiContentSizeCategory. När systeminställningen ändras anropar iOS traitCollectionDidChange på alla UIView. I denna metod måste du uppdatera teckensnitt och beräkna om layouten. SwiftUI gör detta automatiskt — UIKit kräver manuell prenumeration.
För UICollectionView, använd UICollectionViewCompositionalLayout — den anpassar automatiskt antalet kolumner efter skärmbredd och textstorlek. På tillgänglighetsnivåer, växla från tvåkolumns- till enkolumnslayout så att texten inte kapas och element inte överlappar. Använd villkorsstyrd layout: för regular width — två kolumner, för compact eller accessibility — en kolumn.
Grundläggande implementering i UIKit — UIFont.preferredFont(forTextStyle:). Denna metod returnerar ett teckensnitt skalat enligt aktuell systeminställning:
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)
För anpassade teckensnitt använd UIFontMetrics:
let customFont = UIFont(name: "Montserrat-Regular", size: 16)!
titleLabel.font = UIFontMetrics(forTextStyle: .body)
.scaledFont(for: customFont)
// Spåra storleksändringar
NotificationCenter.default.addObserver(
self,
selector: #selector(preferredContentSizeChanged),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
För UILabel i Interface Builder räcker det att ställa in teckensnittet som textstil (Text Style) och aktivera ”Automatically Adjusts Font”. För anpassade teckensnitt stöder inte IB UIFontMetrics — endast via kod.
UIFontMetrics använder samma skalningskurva som preferredFont. Du kan ställa in fromTextStyle: .body, .headline etc. Varje stil har sin egen skalningskoefficient. Body skalas måttligt, Large Title — aggressivt. Om ditt anpassade teckensnitt används för brödtext, använd .body.
I SwiftUI är stödet för Dynamic Type inbyggt som standard. Alla systemmodifierare (.font(.body), .font(.title)) skalas automatiskt. Utvecklaren behöver inte anropa UIFont.preferredFont.
Exempel:
Text("Brödtext")
.font(.body)
.lineLimit(nil)
.minimumScaleFactor(0.5)
För anpassade skalor använd DynamicTypeSize:
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
Text("Adaptiv text")
.font(.body)
.padding(dynamicTypeSize <= .large ? 8 : 16)
}
SwiftUI uppdaterar automatiskt vyn när systemets textstorlek ändras — inga ytterligare prenumerationer på meddelanden krävs.
Modifieraren .font(.body) fungerar endast för systemteckensnitt. För anpassade teckensnitt i SwiftUI, använd Font.custom med UIFontMetrics i bakgrunden. Från och med iOS 16 stöder SwiftUI DynamicTypeSize i @Environment, vilket möjliggör anpassning av marginaler och layout.
Auto Layout är ett obligatoriskt villkor för Dynamic Type-stöd. Fasta bredder och höjder (>=, <=) bryts vid tillgänglighetsstorlekar. Använd intrinsicContentSize för UILabel — den beräknar automatiskt höjden baserat på aktuell teckenstorlek.
Regler för adaptiv layout:
För långa texter (t.ex. artiklar, användarvillkor) ställ in minimumScaleFactor på UILabel — minskar texten som sista utväg när Auto Layout inte kan rymma innehållet. Värdet 0.5 innebär att teckensnittet kan minskas till 50 % av föredragen storlek.
Exempel på anpassning av marginaler efter storlekskategori:
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)
Textkapning — UILabel med numberOfLines = 1 och fast bredd kapar text vid AccessibilityXL. Lösning: numberOfLines = 0 och trailing constraint. Elementöverlappning — knappar med fast höjd överlappar varandra. Lösning: UIStackView med automatic spacing. Utanför skärmgränser — ScrollView är obligatorisk för tillgänglighetsnivåer.
Xcode-simulatorn gör det möjligt att ändra textstorlek: i simulators menyn Settings → Accessibility → Display & Text Size → Larger Text. Växla mellan alla 11 nivåer och kontrollera att texten inte kapas, knapparna är tillgängliga och layouten inte bryts.
För automatiserad testning använd inställningen contentSizeCategory i XCUIApplication:
func testAccessibilitySizes() {
let app = XCUIApplication()
app.launchArguments += [
"-UIPreferredContentSizeCategoryName",
"UICTContentSizeCategoryAccessibilityXXXL"
]
app.launch()
app.scrollViews.buttons["Skicka"].tap()
XCTAssertTrue(app.staticTexts["Formuläret har skickats"]
.waitForExistence(timeout: 5))
}
XCUITest med olika launchArguments gör det möjligt att testa alla skalningsnivåer i CI. Glöm inte att kontrollera tillgänglighetskategorier separat — de bryter oftast layouten. Enligt Apple upptäcks 70 % av Dynamic Type-felen just på tillgänglighetsnivåer, eftersom utvecklare bara testar standardstorlekar.
Xcode Accessibility Inspector visar vilka teckensnitt det valda elementet använder — fast eller skalbart. Om elementet inte reagerar på textstorleksändring i simulatorn betyder det att ett fast teckensnitt används. Ersätt med UIFont.preferredFont eller UIFontMetrics.
Vanliga frågor
Det är automatisk textskalning i applikationen enligt systemets storleksinställningar. Användaren ändrar storleken i Inställningar — alla applikationer som stöder det anpassar sig utan utvecklarens inblandning.
Nej. För anpassade teckensnitt använd UIFontMetrics(scaledFont:). Metoden skalar valfritt teckensnitt relativt till den angivna textstilen med bibehållna proportioner.
11 nivåer: 5 standard (XS, S, M, L, XL) och 6 tillgänglighetsnivåer (från AccessibilityXL till AccessibilityXXXXXL). Body-teckenstorleken kan variera från 14px till 53px.
I UIKit via UIContentSizeCategory.didChangeNotification. I SwiftUI använd @Environment(\.dynamicTypeSize) — vyn uppdateras automatiskt när systeminställningen ändras.
Användare med förstorat teckensnitt kommer att se kapad text, överlappande element och icke-fungerande knappar. Applikationen kan avvisas i App Store Review för brott mot tillgänglighetskrav.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också