iOS13のMFMailComposeViewControllerにつまずいた

# はじめに
もうネタがない...と思いつつ iOS13 の [`MFMailComposeViewController`](https://developer.apple.com/documentation/messageui/mfmailcomposeviewcontroller) につまずいたという噂を聞いたので色々動かしたみました。

動かしてみたところナビゲーションバーのカスタマイズがうまくいかない:confused:

# 検証
`AppDelegate` で下記のように全体のナビゲーションバーをカスタムしてみる。

## 検証1
```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  // Override point for customization after application launch.
  UINavigationBar.appearance().tintColor = .white
  UINavigationBar.appearance().barTintColor = .red
  UINavigationBar.appearance().titleTextAttributes = [.foregroundColor : UIColor.white]
  UINavigationBar.appearance().largeTitleTextAttributes = [.foregroundColor : UIColor.white]
  return true
}
```

`MFMailComposeViewController` の表示は下記。

```swift
if MFMailComposeViewController.canSendMail() {
  let mailVC = MFMailComposeViewController()
  mailVC.mailComposeDelegate = self
  mailVC.setToRecipients(["piyo@example.com "])
  mailVC.setSubject("Singleton")
  mailVC.setMessageBody("しんぐるしんぐるとんとんとん", isHTML: false)
  present(mailVC, animated: true)
} else {
  print("Mail services are not available")
}
```

## 結果1
結果は下記のような表示。(実機が iPod touch と iPad しかないので大きさがちょっと...:see_no_evil:)

| iOS12 | iOS13 |
| --- | --- |
|![12_1](https://user-images.githubusercontent.com/34936885/70438178-985d6a00-1ad0-11ea-9835-9a98fcdfcf4f.png)|![13_1](https://user-images.githubusercontent.com/34936885/70438202-a6ab8600-1ad0-11ea-8562-162117467d60.png)|

うーん両方思った結果とは違う...:neutral_face:

## 検証2
`AppDelegate` はそのまま `MFMailComposeViewController` の表示はをちょっと修正。

```swift
if MFMailComposeViewController.canSendMail() {
  let mailVC = MFMailComposeViewController()
  mailVC.navigationBar.tintColor = .white // ここ追加
  mailVC.navigationBar.titleTextAttributes = [.foregroundColor : UIColor.white] // ここ追加
  mailVC.navigationBar.largeTitleTextAttributes = [.foregroundColor : UIColor.white] // ここ追加
  mailVC.mailComposeDelegate = self
  mailVC.setToRecipients(["piyo@example.com "])
  mailVC.setSubject("Singleton")
  mailVC.setMessageBody("しんぐるしんぐるとんとんとん", isHTML: false)
  present(mailVC, animated: true)
} else {
  print("Mail services are not available")
}
```

## 結果2
結果は下記のような表示。

| iOS12 | iOS13 |
| --- | --- |
|![12_2](https://user-images.githubusercontent.com/34936885/70438184-9dbab480-1ad0-11ea-9da2-b6bec6cf2fef.png)|![13_2](https://user-images.githubusercontent.com/34936885/70438224-b1661b00-1ad0-11ea-8534-34eada65f25f.png)|

うーんボタンは変わったけど両方思った結果とは違う...:neutral_face:

iOS12 でタイトルの色が変わらない件に関しては下記がヒットした。が、解決策は見当たらず:neutral_face:

* [Change title color of navigation bar in MFMailComposeViewController in iOS 12 not working](https://stackoverflow.com/questions/52522308/change-title-color-of-navigation-bar-in-mfmailcomposeviewcontroller-in-ios-12-no)
* [iOS 12.0 : Is there a way to set MFMailComposeViewController navigation bar title's text to white?](https://stackoverflow.com/questions/52451156/ios-12-0-is-there-a-way-to-set-mfmailcomposeviewcontroller-navigation-bar-titl)

## 検証3
iOS12 のタイトルはもうあきらめよう:grimacing:

iOS13 をどうするか...??色々調べてみると iOS13 から `UINavigationBar` の `appearance` の設定が変わった模様（[参考](https://developer.apple.com/documentation/uikit/uinavigationbar/legacy_customizations)）

`AppDelegate` を下記のように書き換えます。

```swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  // Override point for customization after application launch.
  if #available(iOS 13.0, *) {
    let appearance = UINavigationBarAppearance()
    let button = UIBarButtonItemAppearance(style: .plain)
    button.normal.titleTextAttributes = [.foregroundColor: UIColor.white]
    appearance.buttonAppearance = button
    let done = UIBarButtonItemAppearance(style: .done)
    done.normal.titleTextAttributes = [.foregroundColor: UIColor.white]
    appearance.doneButtonAppearance = done
    appearance.backgroundColor = .red
    appearance.titleTextAttributes = [.foregroundColor : UIColor.white]
    appearance.largeTitleTextAttributes = [.foregroundColor : UIColor.white]
    UINavigationBar.appearance().standardAppearance = appearance
    UINavigationBar.appearance().scrollEdgeAppearance = appearance
  } else {
    // Fallback on earlier versions
    UINavigationBar.appearance().tintColor = .white
    UINavigationBar.appearance().barTintColor = .red
    UINavigationBar.appearance().titleTextAttributes = [.foregroundColor : UIColor.white]
    UINavigationBar.appearance().largeTitleTextAttributes = [.foregroundColor : UIColor.white]
  }
  return true
}
```

`MFMailComposeViewController` の表示はもちょっと修正。

```swift
if MFMailComposeViewController.canSendMail() {
  let mailVC = MFMailComposeViewController()
  if #available(iOS 13.0, *) {
  } else {
    mailVC.navigationBar.tintColor = .white
    mailVC.navigationBar.titleTextAttributes = [.foregroundColor : UIColor.white]
    mailVC.navigationBar.largeTitleTextAttributes = [.foregroundColor : UIColor.white]
  }
  mailVC.mailComposeDelegate = self
  mailVC.setToRecipients(["piyo@example.com "])
  mailVC.setSubject("Singleton")
  mailVC.setMessageBody("しんぐるしんぐるとんとんとん", isHTML: false)
  present(mailVC, animated: true)
} else {
  print("Mail services are not available")
}
```

## 結果3
結果は下記のような表示。

| iOS12 | iOS13 |
| --- | --- |
|![12_2](https://user-images.githubusercontent.com/34936885/70438184-9dbab480-1ad0-11ea-9da2-b6bec6cf2fef.png)|![13_3](https://user-images.githubusercontent.com/34936885/70438245-bcb94680-1ad0-11ea-8455-bc591227c189.png)|

はい、だめーーー:neutral_face:

iOS13 が結局変わらない:neutral_face:

# 結論
`MFMailComposeViewController` のカスタマイズはあきらめよう！！ナビゲーションバーのカスタマイズはカスタムクラスなりで対応し `MFMailComposeViewController` に影響が出ないようにしよう:fist:

# さいごに
`appearance` は `MFMailComposeViewController` や `UIActivityViewController` などに思わぬ影響が出ていい思い出がないので個人的には撲滅したいです:expressionless:

(けど `UIView.appearance().isExclusiveTouch = true` はたまに使ったりします:speak_no_evil:)