UIButton의 텍스트 폰트를 변경하려고 기존 방식대로 아래처럼 적용했다.
button.titleLabel?.font = UIFont.systemFont(ofSize: 12, weight: .medium)
하지만 UIButton.Configuration을 사용하는 경우 폰트가 적용되지 않거나 무시되는 문제가 발생했다.
iOS 15부터 UIButton은 Configuration 기반으로 스타일을 관리하는걸로 바뀌었다.
위의 익숙한 프로퍼티가 아니라 Configuration이 최종 스타일을 결정한다.
이런 식으로 이루어지는 과정에서titleLabel.font에 적용해둔 값은 나중에 덮어씌워질 수 있다.
titleLabel.font가 최종으로 적용되지 않을 수 있다!!!
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 텍스트 스타일을 최종적으로 가공하는 함수이다.
한마디로 incoming은 시스템 기본 스타일이고, outgoing은 수정 후 반환할 스타일이다.
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 이렇게 변함
titleLabel?.adjustsFontForContentSizeCategory = true