UILabelのフォントサイズを自動調整させる（adjustsfontsizetofitwidth）

[`adjustsFontSizeToFitWidth`](https://developer.apple.com/documentation/uikit/uilabel/1620546-adjustsfontsizetofitwidth)というプロパティがあるので、それをtrueにすると、
自動調整が効きます。

# adjustsfontsizetofitwidthしてみよう
```swift
import UIKit

class ViewController: UIViewController {    
    override func viewDidLoad() {
        super.viewDidLoad()
        let label = UILabel(frame: CGRect(x: view.center.x - 50, y: view.center.y - 7.5, width: 100, height: 15))
        lable.text = "12345678901234567891"
        label.font = .systemFont(ofSize: 15)    
        view.addSubview(label)
 
```

幅100ptのUILabelに、フォントサイズ１５で２０文字表示してみましょう。

<img width="375" alt="Simulator Screen Shot - iPhone 11 Pro - 2020-04-27 at 10.46.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/3ef3c4e3-ce8f-ac4e-901c-6b200bcc6dea.png">

表示できませんね。
１０文字が限界で、１１文字以上のテキストは１０文字目が…で省略されます。

```swift
label.adjustsFontSizeToFitWidth = true
```
これを入れてみましょう。

<img width="375" alt="Simulator Screen Shot - iPhone 11 Pro - 2020-04-27 at 10.50.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/b3c5a186-0c4c-a202-383e-b8dcb58967d8.png">

表示できました。やったね！

# IBでやる場合
ここからできます。

<img width="260" alt="スクリーンショット 2020-04-27 10.49.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/1b8b8bda-955b-1bc5-731c-91fa0df80c5b.png">

IBだと最小値を絶対に指定させる仕様っぽいです。

# UIButton
UIButtonも文字部分はUILabelを使っているので、同じようにadjustsfontsizetofitwidthが使えます。

# 注意点１.最小値を設定しないとどこまでも小さくなる
ここからadjustsfontsizetofitwidth使う際の罠をいくつか書いていきます。
上記のラベルのテキストをもっと長くしてみます。


```swift
label.text = "Too long string, it's very very long string. Extraordinary long string we could not display it"
```

するとこうなります。

<img width="375" alt="Simulator Screen Shot - iPhone 11 Pro - 2020-04-27 at 11.14.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/3d65cd5f-d1f7-c666-5ae6-4ce2ad22bd44.png">

拡大するとちゃんと表示できてるんですが、ここまで小さいとさすがに表示してる意味がないですね。

[Appleのドキュメント](https://developer.apple.com/documentation/uikit/uilabel/1620546-adjustsfontsizetofitwidth)には、

> If you change it to true, be sure that you also set an appropriate minimum font scale by modifying the minimumScaleFactor property.
（抄訳）もしadjustsfontsizetofitwidthをtrueにしたなら、`minimumScaleFactor`プロパティを適切に設定してください。

とあり、コードでtrueを入れたら、あわせて`minimumScaleFactor`も設定しましょう。
`minimumScaleFactor`のデフォルト値は０なので、デフォルトだと無限に縮小します。
指定がCGFloatなので、小数点で指定しないといけないのがちょっと直感的じゃないですね。
IBだとフォントサイズで指定できるので、そちらの方が楽そうです。

ドキュメント見ると、

> If you specify a value of 0 for this property, the label doesn't scale the text down. The default value of this property is 0.
（抄訳）もしこのプロパティ（`minimumScaleFactor`）に０を指定した場合、そのUILabelはテキストを縮小しません。デフォルt値はゼロです。

って書いてあるんで、デフォルト値だと自動縮小効かないって書いてあるように見えるんですが、
手元のシミュレーター（iOS 13.4.1）で試してる限り、無限に縮小する挙動に見えます。

ここはちょっと謎です。
デフォルトの挙動がちょっと怪しいので、最小値を何かしら指定しとくと安心かもです。

# 注意点2.複数行だと上手く効かないかもしれない
Appleのドキュメントの注意書きで、

> This autoshrinking behavior is only intended for use with a single-line label.
（抄訳）この自動縮小機能は一行のラベル向けに使うことのみを想定しています

とあります。
サンプルアプリで

```swift
label.numberOfLines = 2
label.text = "Too long string, \nit's very very long string. Extraordinary long string we could not display it"
```
こんな改行を入れてやってみたんですが、普通にいい感じに縮小されたので、効くときは効くみたいです。