Dynamic Type: 무엇인가, iOS의 글꼴 크기 조정

저자: IT Sectr 게시일: 2026-02-26 읽는 시간: 8 분
Dynamic Type은 iOS 7부터 운영 체제에 내장된 iOS의 자동 글꼴 크기 조정 시스템입니다. 고정된 텍스트 크기와 달리 Dynamic Type은 사용자가 설정 → 디스플레이 및 텍스트 크기에서 선택한 시스템 접근성 설정에 따라 글꼴 크기를 조정합니다. Apple Human Interface Guidelines(2025)에 따르면 다이내믹 타입 지원은 접근성 설정을 통해 글꼴 크기를 변경하는 32%의 사용자에게 인터페이스 가독성을 향상시킵니다.

핵심 포인트

  • Dynamic Type은 사용자 시스템 설정에 따라 자동으로 글꼴을 조정하는 iOS 내장 시스템으로, iOS 7부터 사용 가능합니다.
  • UIFontMetrics(iOS 11+)는 비율을 유지하면서 사용자 정의 글꼴을 다이내믹 타입에 적용하는 주요 API입니다.
  • 텍스트 스타일 — .largeTitle부터 .caption2까지 11개의 사전 정의된 스타일로, 각각 지정된 크기와 두께를 가집니다.
  • Auto Layout은 intrinsicContentSize를 통해 글꼴 변경에 올바르게 반응합니다 — 레이아웃이 자동으로 다시 계산됩니다.
  • Dynamic Type은 App Review 통과에 필수이며 Apple이 접근성 준수를 위해 권장합니다.

Dynamic Type이란?

Dynamic Type은 시스템 텍스트 크기가 변경될 때 앱 글꼴이 자동으로 조정되도록 하는 Apple 기술입니다. 사용자는 설정 → 손쉬운 사용 → 디스플레이 및 텍스트 크기에서 선호하는 크기를 설정하고, Dynamic Type을 지원하는 모든 앱은 재시작 없이 글꼴 크기를 조정합니다.

시스템은 11단계의 크기 조정 레벨을 제공합니다: XS(14pt 기준)부터 XXXL(23pt 기준)까지, 그리고 심각한 시각 장애가 있는 사용자를 위한 5개의 추가 접근성 크기(AX1–AX5)가 있습니다. 크기가 변경되면 iOS는 UIContentSizeCategory.didChangeNotification을 생성하고, 앱은 UIFontMetrics를 통해 글꼴을 다시 로드해야 합니다. Apple Human Interface Guidelines에 따르면 Dynamic Type은 줄 간격이나 문자 비율을 변경하지 않고 글꼴 크기만 변경하여 모든 크기에서 가독성을 유지합니다.

Dynamic Type은 접근성 상태를 목표로 하는 앱에 필수입니다. WWDC 2024에서 Apple은 다이내믹 타입을 지원하지 않는 앱이 핵심 기능이 텍스트 읽기와 관련된 경우 리뷰에서 거부될 위험이 있다고 발표했습니다. IT Sectr 프로젝트에서는 첫 번째 버전부터 Dynamic Type을 구현합니다 — 이는 이후 접근성 적응에 소요되는 시간을 최대 20% 절약합니다.

iOS 텍스트 스타일: largeTitle부터 caption2까지

Apple은 시스템 글꼴 SF Pro를 위해 UIFontDescriptor.UIAttributes를 통해 11개의 사전 정의된 텍스트 스타일을 제공합니다. 개발자는 픽셀 크기를 지정하지 않고 의미론적 스타일을 선택하며, iOS는 사용자 설정에 따라 실제 글꼴 크기를 적용합니다.

스타일 크기(기본) 크기(AX5) 용도
.largeTitle 34pt 62pt 1차 화면 제목
.title1 28pt 50pt 2차 제목
.title2 22pt 40pt 섹션 제목
.title3 20pt 36pt 소제목
.headline 17pt semibold 31pt 목록에서 강조 텍스트
.body 17pt 31pt 본문 텍스트
.callout 16pt 29pt 콜아웃 및 보충 텍스트
.subheadline 15pt 27pt 요소 레이블
.footnote 13pt 23pt 각주 및 작은 텍스트
.caption1 12pt 21pt 이미지 캡션
.caption2 11pt 19pt 레이블 및 작은 캡션

각 스타일은 고정된 두께로 시스템 글꼴 SF Pro를 사용합니다(body는 Regular, headline은 Bold). 사용자 정의 글꼴은 UIFontMetrics를 통해 연결됩니다 — 타사 글꼴을 다이내믹 타입에 적용하는 유일한 올바른 방법입니다.

UIFontMetrics: 사용자 정의 글꼴 적용

UIFontMetrics는 iOS 11에서 도입된 클래스로, 선택한 텍스트 스타일에 비례하여 임의의 UIFont를 조정합니다. iOS 11 이전에는 개발자가 preferredFontForTextStyle을 직접 호출했으며, 이는 시스템 글꼴 SF Pro만 반환합니다. UIFontMetrics는 이 문제를 해결합니다: 모든 글꼴을 받아 두께와 비율을 유지한 조정된 버전을 반환합니다.

scaledFont(for:) 메서드는 사용자의 현재 텍스트 크기에 따라 조정 계수를 계산합니다: 크게가 선택된 경우 계수는 1.0, 매우 크게(AX1)의 경우 약 1.3, 최대(AX5)의 경우 최대 1.8입니다. 계수는 시스템이 아닌 사용자 정의 글꼴의 기준 크기에 적용됩니다 — 이는 모든 크기에서 디자이너의 의도가 유지되도록 보장합니다.

UIFontMetrics는 앱의 모든 사용자 정의 글꼴에 권장됩니다. WWDC 2024에서 Apple은 Accessibility Inspector 도구를 선보였는데, 이는 Dynamic Type 지원을 확인하고 UIFontMetrics 대신 고정 글꼴 크기를 사용하는 요소를 강조 표시합니다. IT Sectr에서는 2018년부터 모든 프로젝트에서 UIFontMetrics를 구현했습니다 — 이로 인해 텍스트 겹침 버그가 35% 감소했습니다.

Swift 코드 예제

예제 1: preferredFontForTextStyle을 통한 시스템 글꼴

레이블에 동적 글꼴을 얻는 가장 간단한 방법입니다. 코드는 시스템 텍스트 크기 변경에 자동으로 반응하는 .body 스타일의 UILabel 설정 방법을 보여줍니다.

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),
        ])
    }
}

adjustsFontForContentSizeCategory = true 플래그는 시스템 텍스트 크기가 변경될 때 자동으로 글꼴을 업데이트합니다 — 이 플래그가 없으면 Dynamic Type이 기존 레이블에서 작동하지 않습니다. 크기가 변경되면 iOS가 layoutIfNeeded를 호출하고, 레이블은 수동 개입 없이 글꼴을 업데이트합니다.

예제 2: UIFontMetrics를 통한 사용자 정의 글꼴

사용자 정의 글꼴(예: Montserrat)을 사용할 때 preferredFontForTextStyle을 호출하면 SF Pro가 반환되고 사용자 글꼴이 반환되지 않습니다. UIFontMetrics는 사용자 정의 글꼴을 특별히 조정하여 디자인을 유지합니다.

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
)

scaledFont(for:) 메서드는 기본 UIFont를 받아 .title3 스타일에 비례하여 조정된 버전을 반환합니다. 접근성 크기 AX5에서 Montserrat-Bold 20pt 글꼴은 ~36pt가 됩니다 — 이 스타일의 시스템 글꼴이 증가하는 만큼 정확히 증가합니다. IT Sectr에서는 2018년부터 사용자 정의 글꼴을 사용하는 모든 프로젝트에서 이 패턴을 사용하여 시각 장애가 있는 사용자의 작은 텍스트 불만을 완전히 없앴습니다.

예제 3: 크기 변경 구독

수동으로 글꼴을 업데이트하는 경우(adjustsFontForContentSizeCategory 없이) UIContentSizeCategory.didChangeNotification 알림을 구독하세요. 이는 자동 글꼴 업데이트를 상속하지 않는 사용자 정의 UI 요소에 필요합니다.

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)
    }
}

didChangeNotification을 구독하면 앱을 재시작하지 않고 시스템 설정이 변경될 때마다 사용자 정의 요소가 글꼴을 업데이트합니다. iOS 15부터는 Live Text Size를 지원하는 앱에서 제어 센터를 통해 텍스트 크기를 변경해도 알림이 도착합니다.

자주 묻는 질문

Dynamic Type이 모든 iOS 버전에서 작동하나요?

Dynamic Type은 iOS 7 이상에서 사용할 수 있습니다. UIFontMetrics는 iOS 11에서 도입되었으며, 그 이전에는 preferredFontForTextStyle 메서드가 직접 사용되었습니다. iOS 15+에서는 다이내믹 타입이 큰 글꼴을 위한 추가 접근성 크기(AX1–AX5)를 지원합니다. iOS 10 이하를 지원하는 앱은 UIFontMetrics 없이 preferredFontForTextStyle을 사용하여 시스템 글꼴 SF Pro로만 지원이 제한됩니다.

Xcode에서 Dynamic Type을 테스트하는 방법은?

Xcode 15+에서 시뮬레이터를 열고 설정 → 손쉬운 사용 → 디스플레이 및 텍스트 크기 → 더 큰 텍스트로 이동하세요. 슬라이더를 드래그하여 크기를 변경합니다. Xcode 자체에는 Debug → Accessibility Inspector가 있어 고정 글꼴이 있는 요소를 강조 표시합니다. 자동화를 위해 XCUITest를 통해 UISlider 설정을 변경하는 테스트를 사용하세요 — 모든 화면이 올바르게 재구성되도록 보장합니다.

Dynamic Type을 위해 레이아웃을 조정해야 하나요?

, 다이내믹 타입의 Auto Layout은 UILabel과 UIButton에서 intrinsicContentSize 사용이 필요합니다. 접근성 크기에서는 텍스트가 superview 경계를 초과할 수 있습니다 — UIScrollView를 추가하거나 leading/trailing 제약 조건을 늘리세요. 패딩에는 UIFontMetrics.scaledValue를 사용하여 글자 간격도 글꼴에 비례하여 조정되도록 합니다.

요약

  • Dynamic Type은 사용자의 시스템 접근성 설정에 반응하는 iOS의 자동 글꼴 크기 조정 시스템입니다.
  • 11개의 텍스트 스타일(.largeTitle 34pt부터 .caption2 11pt까지)이 제목에서 캡션까지 모든 인터페이스 시나리오를 다룹니다.
  • UIFontMetrics(iOS 11+)는 사용자 정의 글꼴을 다이내믹 타입에 적용하는 유일한 올바른 API입니다.
  • adjustsFontForContentSizeCategory = true 플래그는 시스템 크기가 변경될 때 UILabel 및 UIButton 글꼴을 자동으로 업데이트합니다.
  • UIContentSizeCategory.didChangeNotification 구독은 표준 업데이트를 상속하지 않는 사용자 정의 UI 요소에 필요합니다.
  • Dynamic Type은 Apple 권장 사항에 따라 텍스트 기능이 있는 앱의 App Review 통과에 필수입니다.
  • 모든 프로젝트에서 UIFontMetrics.scaledFont(for:)를 사용하세요 — 모든 접근성 크기에서 디자이너 글꼴을 유지하는 유일한 방법입니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기