Dynamic Type: vad är det, skalning av teckensnitt i iOS

Författare: IT Sectr Publicerad: 2026-02-26 Lästid: 8 min
Dynamic Type — ett system för automatisk skalning av teckensnitt i iOS, inbyggt i operativsystemet sedan version iOS 7. Till skillnad från fast textstorlek anpassar Dynamic Type teckenstorleken efter systemets tillgänglighetsinställningar som användaren har valt i Settings → Display & Text Size. Enligt Apple Human Interface Guidelines (2025) ökar stöd för dynamisk typ läsbarheten i gränssnittet för 32% av användarna som ändrar teckenstorlek via tillgänglighetsinställningar.

Huvudpunkter

  • Dynamic Type — det inbyggda iOS-systemet för automatisk skalning av teckensnitt enligt användarens systeminställningar, tillgängligt sedan iOS 7.
  • UIFontMetrics (iOS 11+) — det primära API:et för att anpassa anpassade teckensnitt till dynamisk typ med bevarade proportioner.
  • Textstilistik — 11 fördefinierade stilar från .largeTitle till .caption2, var och en med specifik storlek och utformning.
  • Auto Layout reagerar korrekt på teckensnittsändringar via intrinsicContentSize — layouten räknas om automatiskt.
  • Dynamic Type är obligatoriskt för att klara App Review och rekommenderas av Apple för tillgänglighetsefterlevnad.

Vad är Dynamic Type?

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.

Textstilar i iOS: från largeTitle till caption2

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: anpassning av anpassade teckensnitt

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%.

Kodexempel i Swift

Exempel 1: Systemteckensnitt via preferredFontForTextStyle

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.

swift
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.

Exempel 2: Anpassat teckensnitt via UIFontMetrics

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.

swift
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.

Exempel 3: Prenumerera på storleksändring

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.

swift
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

Fungerar Dynamic Type på alla versioner av iOS?

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.

Hur testar man Dynamic Type i Xcode?

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.

Måste layouten skalas för Dynamic Type?

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

  • Dynamic Type — automatiskt skalningssystem för teckensnitt i iOS som reagerar på användarens systeminställningar för tillgänglighet.
  • 11 textstilar (från .largeTitle 34pt till .caption2 11pt) täcker alla gränssnittsscenarier — från titlar till beskrivningar.
  • UIFontMetrics (iOS 11+) — det enda korrekta API:et för att anpassa anpassade teckensnitt till dynamisk typ.
  • Flaggan adjustsFontForContentSizeCategory = true uppdaterar automatiskt teckensnittet för UILabel och UIButton vid systemstorleksändring.
  • Prenumeration på UIContentSizeCategory.didChangeNotification är nödvändig för anpassade UI-element som inte ärver standarduppdatering.
  • Dynamic Type är obligatoriskt för att klara App Review i appar med textfunktionalitet enligt Apples rekommendation.
  • Använd UIFontMetrics.scaledFont(for:) i alla projekt — det är det enda sättet att bevara designerteckensnittet vid alla tillgänglighetsstorlekar.

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.

Diskutera projektet

Läs också