Xcode11のUISegmentedControlにつまずいた

# はじめに
もうネタがない...（リリースノートを漁る日々）

[Xcode リリースノート](https://developer.apple.com/documentation/xcode_release_notes/xcode_11_2_release_notes#3396543)で下記のようんものを発見:joy_cat:

>Setting the Selected Segment Tint Color of a segmented control in Interface Builder to a named color will cause a failure when the view is loaded on iOS 12 and earlier. (55254963)

`UISegmentedControl` で　iOS13 から追加された [`selectedSegmentTintColor`](https://developer.apple.com/documentation/uikit/uisegmentedcontrol/3335209-selectedsegmenttintcolor) に Storyboard,xib 上で Color Asset で作成した色を設定すると iOS13 未満でクラッシュする模様。

※ [Xcode11.3](https://developer.apple.com/documentation/xcode_release_notes/xcode_11_3_release_notes#3405156) では修正されたようです:innocent:

# 検証
とりあえず検証してみました。Storyboard で `selectedSegmentTintColor` に Color Asset の色を設定して iOS12 で実行！！すると下記のようなエラーが出てクラッシュしました:joy_cat:

>Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UISegmentedControl 0x10092a900> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key selectedSegmentTintColor.'

よくみる UndefinedKey ですね。。。
  
# 対応
対応は下記２パターンかと思います。

* Storyboard で `selectedSegmentTintColor` に Custom Color を設定する  
Color Asset の色で設定するのはあきらめる方法です。
* コードで `selectedSegmentTintColor` に Color Asset の色を設定する  
Storyboard では `selectedSegmentTintColor` に色を設定せずコード上で下記のように設定する方法です。

```swift
@IBOutlet private weak var segmentedControl: UISegmentedControl! {
  didSet {
    if #available(iOS 13.0, *) {
      segmentedControl.selectedSegmentTintColor = UIColor(named: "Color")
    } 
  }
}
```

これで iOS13, iOS12 でもクラッシュせずに表示できるようになりました！！！

# UISegmentedControl の色について
とりあえずクラッシュしないようになりましたが `UISegmentedControl` の色を iOS12, 13 である程度統一させようと思うと色々工夫しないといけないようです。

参考

* [20190920 iOS 13 対応ではまった話](https://speakerdeck.com/itok/20190920-ios-13-dui-ying-dehamatutahua?slide=12)
* [iOS13でUISegmentedControlの見た目をカスタマイズする](https://qiita.com/gaussbeam/items/7945f04310f155d4e7a4)

## selectedSegmentTintColor を設定
Storyboard で　`selectedSegmentTintColor` に色を設定するだけだと下記のようになります。

| iOS12 | iOS13 Light | iOS13 Dark |
| --- | --- | --- |
|![tint_color_default](https://user-images.githubusercontent.com/34936885/70389291-b52a6c80-1a00-11ea-88d1-0324386736ed.png)|![13_light](https://user-images.githubusercontent.com/34936885/70389299-c4a9b580-1a00-11ea-91d8-6501e1a9110d.png)|![13_dark](https://user-images.githubusercontent.com/34936885/70389295-be1b3e00-1a00-11ea-916b-bca675a796b6.png)|

## selectedSegmentTintColor & tintColor を設定
Storyboard で　`tintColor` も色を設定してみる

| iOS12 | iOS13 Light | iOS13 Dark |
| --- | --- | --- |
|![tint_color](https://user-images.githubusercontent.com/34936885/70389289-b065b880-1a00-11ea-999a-e54ed630c4fc.png)|![13_light](https://user-images.githubusercontent.com/34936885/70389299-c4a9b580-1a00-11ea-91d8-6501e1a9110d.png)|![13_dark](https://user-images.githubusercontent.com/34936885/70389295-be1b3e00-1a00-11ea-916b-bca675a796b6.png)|

ちょっとダークモードの未選択の方がみずらい気がしますが、許容範囲な気も...

Color Asset の色を使いたい場合は下記のような感じ

```swift
@IBOutlet private weak var segmentedControl: UISegmentedControl! {
  didSet {
    if #available(iOS 13.0, *) {
      segmentedControl.selectedSegmentTintColor = UIColor(named: "Color")
    } else {
      segmentedControl.tintColor = UIColor(named: "Color") // こっちはstoryboardでも可
    }
  }
}
```

# その他
その他にも `UISegmentedControl` は iOS13 で変更されている部分があるそうです。

背景画像を設定していっても角丸処理が入り角が切り取られるんだとか。

* [iOS 13 UISegmentedControl: 3 important changes](https://medium.com/flawless-app-stories/ios-13-uisegmentedcontrol-3-important-changes-d3a94fdd6763)

# さいごに
`UISegmentedControl` は iOS13 で色々変更があったようですが、私はあまり使っていなかったのでほぼ影響ありませんでした:expressionless:

# 参考
* [Xcode リリースノート](https://developer.apple.com/documentation/xcode_release_notes/xcode_11_2_release_notes#3396543)
* [selectedSegmentTintColor](https://developer.apple.com/documentation/uikit/uisegmentedcontrol/3335209-selectedsegmenttintcolor)
* [20190920 iOS 13 対応ではまった話](https://speakerdeck.com/itok/20190920-ios-13-dui-ying-dehamatutahua?slide=12)
* [iOS13でUISegmentedControlの見た目をカスタマイズする](https://qiita.com/gaussbeam/items/7945f04310f155d4e7a4)
* [iOS 13 UISegmentedControl: 3 important changes](https://medium.com/flawless-app-stories/ios-13-uisegmentedcontrol-3-important-changes-d3a94fdd6763)