Huvudpunkter
Dynamic Type — Apple-teknik som gör att appens teckensnitt automatiskt skalas när systemets textstorlek ändras. Användaren ställer in önskad storlek i Settings → Accessibility → Display & Text Size och alla appar som stöder Dynamic Type anpassar teckenstorleken utan omstart.
Systemet erbjuder 11 skalningsnivåer: från XS (14pt bas) till XXXL (23pt bas), samt 5 extra tillgänglighetsstorlekar (AX1–AX5) för användare med allvarliga synnedsättningar. När storleken ändras genererar iOS ett meddelande UIContentSizeCategory.didChangeNotification och appen måste läsa in teckensnitten igen via UIFontMetrics. Enligt Apple Human Interface Guidelines ändrar Dynamic Type inte radavstånd och bokstavsproportioner — endast teckenstorleken, vilket bevarar läsbarheten vid alla storlekar.
Dynamic Type är obligatoriskt för appar som strävar efter tillgänglighetsstatus (accessibility). På WWDC 2024 meddelade Apple att appar utan stöd för dynamisk typ riskerar avslag vid granskning om deras huvudsakliga funktionalitet är relaterad till textläsning. I IT Sectr-projekt implementerar vi Dynamic Type från första versionen — detta sparar upp till 20% tid för efterföljande anpassning till tillgänglighet.
Apple tillhandahåller 11 fördefinierade textstilar, som var och en visas i UIFontDescriptor.UIAttributes för systemteckensnittet SF Pro. Utvecklaren anger inte pixelstorlek — han väljer en semantisk stil och iOS tillämpar lämplig teckenstorlek beroende på användarens inställningar.
| Stil | Storlek (standard) | Storlek (AX5) | Användning |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | Skärmtitlar på första nivån |
| .title1 | 28pt | 50pt | Sekundära titlar |
| .title2 | 22pt | 40pt | Sektionstitlar |
| .title3 | 20pt | 36pt | Underrubriker |
| .headline | 17pt semibold | 31pt | Markerade text i listor |
| .body | 17pt | 31pt | Huvudtext |
| .callout | 16pt | 29pt | Utrop och extra text |
| .subheadline | 15pt | 27pt | Elementbeskrivningar |
| .footnote | 13pt | 23pt | Fotnoter och liten text |
| .caption1 | 12pt | 21pt | Bildbeskrivningar |
| .caption2 | 11pt | 19pt | Etiketter och små beskrivningar |
Varje stil använder systemteckensnittet SF Pro med fast utformning (Regular för body, Bold för headline). Anpassade teckensnitt ansluts via UIFontMetrics — det enda korrekta sättet att anpassa ett tredjepartsteckensnitt till dynamisk typ.
UIFontMetrics — klass som introducerades i iOS 11, som skalar valfri UIFont proportionellt mot den valda textstilen. Före iOS 11 använde utvecklare direkt anrop av preferredFontForTextStyle, som endast returnerar systemteckensnittet SF Pro. UIFontMetrics löser detta problem: det accepterar vilket teckensnitt som helst och returnerar dess skalade version, med bevarad utformning och proportioner.
Metoden scaledFont(for:) beräknar skalningsfaktorn baserat på användarens aktuella textstorlek: om storleken "Stor" (Large) är vald är faktorn 1.0; "Mycket stor" (AX1) — cirka 1.3; för "Maximal" (AX5) — upp till 1.8. Faktorn tillämpas på basstorleken för det anpassade teckensnittet, inte på systemteckensnittet — detta garanterar att designerns avsikt bevaras vid alla storlekar.
UIFontMetrics rekommenderas för alla anpassade teckensnitt i appen. På WWDC 2024 visade Apple verktyget Accessibility Inspector, som kontrollerar Dynamic Type-stöd och markerar element som använder fast storlek istället för UIFontMetrics. På IT Sectr har vi implementerat UIFontMetrics i alla projekt sedan 2018 — detta har minskat antalet buggar med överlappande text med 35%.
Det enklaste sättet att få ett dynamiskt teckensnitt för en etikett. Koden visar hur man ställer in en UILabel med stilen .body som automatiskt reagerar på ändring av systemets textstorlek.
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),
])
}
}
Flaggan adjustsFontForContentSizeCategory = true uppdaterar automatiskt teckensnittet när systemets textstorlek ändras — utan denna flagga fungerar inte Dynamic Type för en befintlig etikett. När storleken ändras anropar iOS layoutIfNeeded och etiketten uppdaterar teckensnittet utan manuell inblandning.
Vid användning av ett anpassat teckensnitt (t.ex. Montserrat) returnerar anropet preferredFontForTextStyle SF Pro, inte ditt teckensnitt. UIFontMetrics skalar just det anpassade teckensnittet och bevarar dess 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
)
Metoden scaledFont(for:) accepterar ett bas-UIFont och returnerar en skalad version proportionell mot stilen .title3. Vid tillgänglighetsstorleken AX5 blir teckensnittet Montserrat-Bold 20pt ~36pt — exakt lika mycket som systemteckensnittet för denna stil skulle öka. På IT Sectr använder vi detta mönster i alla projekt med anpassade teckensnitt sedan 2018, vilket helt har eliminerat klagomål på liten text från användare med synnedsättningar.
Om du uppdaterar teckensnittet manuellt (utan adjustsFontForContentSizeCategory), prenumerera på meddelandet UIContentSizeCategory.didChangeNotification. Detta är nödvändigt för anpassade UI-element som inte ärver automatisk teckensnittsuppdatering.
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)
}
}
Prenumeration på didChangeNotification garanterar att det anpassade elementet uppdaterar teckensnittet vid varje ändring av systeminställningar utan omstart av appen. Från och med iOS 15 kommer meddelandet även när textstorleken ändras via Control Center i appar som stöder Live Text Size.
Vanliga frågor
Dynamic Type är tillgängligt på iOS 7 och nyare. UIFontMetrics dök upp i iOS 11 — innan dess användes metoden preferredFontForTextStyle direkt. På iOS 15+ stöder dynamisk typ extra tillgänglighetsstorlekar (AX1–AX5) för stora teckensnitt. Appar som stöder iOS 10 och äldre använder preferredFontForTextStyle utan UIFontMetrics, vilket begränsar stödet till endast systemteckensnittet SF Pro.
I Xcode 15+, öppna simulatorn och välj Settings → Accessibility → Display & Text Size → Larger Text. Dra reglaget för att ändra storlek. I själva Xcode finns Debug → Accessibility Inspector, som markerar element med fast teckensnitt. För automatisering, använd ett test som ändrar inställningarnas UISlider via XCUITest — detta garanterar att alla skärmar byggs om korrekt.
Ja, Auto Layout med dynamisk typ kräver användning av intrinsicContentSize i UILabel och UIButton. Vid tillgänglighetsstorlekar kan texten gå utanför superviewens gränser — lägg till UIScrollView eller öka leading/trailing-begränsningarna. Använd UIFontMetrics.scaledValue för mellanrum (padding) så att även bokstavsmellanrum skalas proportionellt med teckensnittet.
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å