こんにちは。ざわかける!のざわ(@zw_kakeru)です。
Swift5において、UILabelのビューサイズに対して常にはみ出さない(…で省略されない)最大の文字サイズ設定をした際に、調べてもすぐには解が出てこなかったのでメモしておきます。
動作環境
macOS: 11.2.1(Big Sur)
Xcode: 12.4
Swift: 5.3.2
実現したいこと
通常、UILabelの文字サイズは(何もしなければ)デフォルト設定で表示されます。
let label: UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: 50, height: 30))
label.backgroundColor = .systemGray
label.textAlignment = NSTextAlignment.center
label.numberOfLines = 0
label.text = "123"

UILabelのサイズに対して文字が小さいため、できれば常に目一杯大きく表示されるようにしたいですね(これが今回実現したいことです)。
少し調べてみるとadjustsFontSizeToFitWidthをtrueに設定することで、UILabelの横幅ぴったりになるよう文字サイズを自動で設定してくれるとのことでした。
label.adjustsFontSizeToFitWidth = true
しかし、この記述を行っても文字は小さいまま変化はありませんでした。何でやねん。

解決策
公式ドキュメントに書いてありました。
the text in the text property exceeds the label’s bounding rectangle, the label reduces the font size until the text fits or it has scaled the font down to the minimum font size.
https://developer.apple.com/documentation/uikit/uilabel/1620546-adjustsfontsizetofitwidth
adjustsFontSizeToFitWidthは文字がフレームサイズを”exceed”した時に文字サイズを”reduce”すると書かれており、どうも拡大も勝手にしてくれるというわけではないようです。
(これを知らなかったせいで私は沼にハマってしまいました…)
なので文字サイズを適当に大きくしておけば必然的に文字がビュー内に収まりきらず、収まりきる最大サイズで設定してくれるみたいですね。
値で指定すると前述のようにビューサイズによって最大とならないことがあるので、UILabelの高さの値を入れてみましょう。
label.adjustsFontSizeToFitWidth = true
label.font = label.font.withSize(label.bounds.height)

これをUILabelを継承した自作クラスのinitに入れるなり、UILabel自体をoverrideするなりすれば、次回からはビューの大きさを考えることなく、収まりきる最大文字サイズの設定が行われます。
文字がビュー内に収まりきらなければ良いんだから、文字サイズを常に10000とかにしとけば良いじゃんって思うかもしれませんが、なんとなくそれは嫌だったのでこのような手法を取りました。
(コード読んでる最中に突然10000って出てきて「何の数字!?」ってなりそうだったので。heightで指定しておけば「あ、大きさ(高さ)ピッタリぐらいに文字サイズを設定したんだな」って感覚的に分かると思います。実際には違うんですけど。)
その他
こんなのデフォルトで設定しておいてくれよとも思いますが、場合によっては文字が小さくなりすぎてしまうため、読みやすさの担保という意味では現状の方が良いのかもしれませんね…うーん、難しい。
adjustsFontSizeToFitWidthって名前からして、ビューの幅に合わせて拡大も縮小もやってくれるって思いますやん…
ちなみに文字サイズが大きすぎてビューに収まりきらない場合、…で省略されてしまいます。
label.adjustsFontSizeToFitWidth = false
label.font = label.font.withSize(100)

以上です。