😇

【Swift】UIButtonのtitleLabel.fontでフォントが変わらないときの対処法

2022/03/10に公開

iOS15からUIButtonの扱いが変更されました。
それに伴い、単にtitleLabel.fontで指定してもフォントを変えられなくなりました。

iOS15より前のバージョンをサポートする場合であっても使える対処法が以下となります。

if #available(iOS 15.0, *) {
    button.configuration = nil
 }
button.titleLabel?.font = UIFont(name: "Zapfino", size: 20)
}

iOS15のボタンには、基本的にPlain, Gray, Titted, Filledの4つのスタイルがあります。
スタイルはconfigurationで指定できるのですが、これはiOS15で追加されたものです。
そのため、iOS15より前もサポートする場合はボタンのスタイルをDefaultに変更する必要があります。
Storyboardで設定する、またはコードでconfigurationをnilとすることでDefaultとして扱うことが可能となります。

こうすることでiOS14まででやっていたフォントの変更が有効になります。

おまけ

iOS15より前のバージョンのサポート不要かつconfigurationがnilじゃない場合、以下の方法でうまくいきます。
が、もっと簡潔な書き方があるのでは?って思ってます。。
ご存じの方、コメントなり何なりでご教示いただけたら嬉しいです!

var config = UIButton.Configuration.plain()
var container = AttributeContainer()
container.font = UIFont(name: "Zapfino", size: 20)
config.attributedTitle = AttributedString("Button", attributes: container)

config.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
    var outgoing = incoming
    outgoing.font = UIFont(name: "Zapfino", size: 20)
    return outgoing
}
button.configuration = config

参考

https://useyourloaf.com/blog/button-configuration-in-ios-15/
https://www.raywenderlich.com/27854768-uibutton-configuration-tutorial-getting-started

Discussion