[내일배움캠프 13~19주차](leafLog) 6. UIButton.Configuration

yeseul jang·2026년 4월 13일

내일배움캠프

목록 보기
32/32

트러블 슈팅

⚠️ 1. 문제 상황

UIButton의 텍스트 폰트를 변경하려고 기존 방식대로 아래처럼 적용했다.

button.titleLabel?.font = UIFont.systemFont(ofSize: 12, weight: .medium)

하지만 UIButton.Configuration을 사용하는 경우 폰트가 적용되지 않거나 무시되는 문제가 발생했다.

🔎 2. 원인 분석

UIButton.Configuration

iOS 15부터 UIButton은 Configuration 기반으로 스타일을 관리하는걸로 바뀌었다.

  • titleLabel
  • backgroundColor
  • font

위의 익숙한 프로퍼티가 아니라 Configuration이 최종 스타일을 결정한다.

  • Configuration 생성 -> 내부에서 텍스트 스타일 생성 -> 버튼에 적용

이런 식으로 이루어지는 과정에서titleLabel.font에 적용해둔 값은 나중에 덮어씌워질 수 있다.

titleLabel.font가 최종으로 적용되지 않을 수 있다!!!

🚀 3. 해결 방법

titleTextAttributesTransformer 사용

configuration.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
    var outgoing = incoming
    
    let baseFont = UIFont.systemFont(ofSize: 12, weight: .medium)
    outgoing.font = UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: baseFont)
    
    return outgoing
}

titleTextAttributesTransformer는 UIButton 텍스트 스타일을 최종적으로 가공하는 함수이다.

동작 방식

  1. 시스템이 기본 텍스트 스타일 생성 (incoming)
  2. 우리가 수정 (outgoing)
  3. 최종 스타일로 적용

한마디로 incoming은 시스템 기본 스타일이고, outgoing은 수정 후 반환할 스타일이다.

🔎 4. 해결 방법 분석

기존 방식

button.titleLabel?.font = ...
이런 식으로 폰트를 설정하려고 하면 최신 UIKit 구조와 맞지 않아서 Configuration 적용 시 덮어씌워질 수 있다

정리하면

titleLabel.font은 이전 방식이고
Configuration를 쓴다면 titleTextAttributesTransformer를 써야 한다!

📌 추가 알아 둘 사항

다이나믹 타입 적용

configuration.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
    var outgoing = incoming
    let baseFont = UIFont.systemFont(ofSize: 14, weight: .medium)
    outgoing.font = UIFontMetrics(forTextStyle: .subheadline).scaledFont(for: baseFont)
    return outgoing
}
  • 사용자 설정에 따라 폰트 크기 자동 조절되도록 하고 싶으면 이런식으로 설정해 주어야 한다.
  • UIFontMetrics(forTextStyle: .subheadline) :이 코드는 .subheadline이 걸 기반으로 커졌다 작아졌다 하도록 설정
  • .scaledFont(for: baseFont) :사용자 설정의 글자크기에 맞게 폰트를 자동으로 키워줌

ex) 기본 설정으로 14pt이지만 사용자 설정이 큰 글씨이면 자동으로 16pt, 18pt 이렇게 변함

  • UILabel, UITextField, 등등 화면에 직접 그려지는 UI 컴포넌트에서는 아래의 코드도 추가해 줘야함!
titleLabel?.adjustsFontForContentSizeCategory = true
profile
iOS 개발

0개의 댓글