Xcode11対応（画面編）

## はじめに
Xcode11でビルドすることでBase SDKがiOS 13 SDKとなり、画面で対応した内容を記載したいと思います。
2020年4月以降は新しくリリースするアプリやアップデートするアプリ両方ともXcode11ビルドが必須になりますので、Xcode11対応の参考にしていただければ幸いです。

参考：
[Submit Your iOS Apps to the App Store](https://developer.apple.com/news/?id=09102019a&1568158483)

## 1.ダークモード対応の回避（一時的な処置）

ダークモードに対応できていないアプリでは、一時的な処置としてダークモード対応を回避する設定を入れる必要があります。この設定を行わないとダークモード設定された端末でアプリを表示すると、自動的にダークモードになっている箇所となっていない箇所が混在した画面が表示されてしまします。
一時的な処置としてアプリを常にライトモードにする設定を行うことにより、端末がダークモード設定されていても、アプリはライトモードになります。

※ただし、Appleはダークモードへの対応について強く推奨する`Supporting Dark Mode is strongly encouraged. `と言っており、どこかで対応はすべきかと思います。

参考：[Opt Out of Dark Mode Entirely](https://developer.apple.com/documentation/appkit/supporting_dark_mode_in_your_interface/choosing_a_specific_interface_style_for_your_ios_app)

### 【対応内容】

Info.plistでUIUserInterfaceStyleキーに`Light`を指定することで、アプリではライトモード扱いとなり回避できます。

```xml
<key>UIUserInterfaceStyle</key>
<string>Light</string>
```

|ダークモード設定時（Lightモード対応前）| ダークモード設定時（Lightモード対応後）|
| --- | --- |
|![IMG_2755.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361214/72b155ad-3bcb-2415-e489-d3a88f5305d9.png)|![IMG_2756.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361214/ec2f7910-5f0d-8077-ef25-9460977626a1.png)

## 2.モーダル画面フルスクリーン修正
アプリによってモーダル画面表示している部分があるかとおもいますが、。Xcode11ビルドのiOS13SDKだと、画面表示のUIModalPresentationStyleのデフォルト（automatic）が効いてしまい、セミモーダル画面（下へのスワイプで閉じることができる画面）表示になってしまいます。
実際、セミモーダル画面表示に適した部分はいいのですが、それを想定していない画面についてはフルスクリーンにする必要があります。

#### 【対応内容】

modalPresentationStyleに`.fullScreen`を明示的に指定することで、下へのスワイプで閉じないフルスクリーンモーダル画面の表示に変更できます。

```swift
let container = WalkthroughContainerController()
container.modalPresentationStyle = .fullScreen  // ←★これを追加
```


## 3.iOS13でモーダルを重ねた場合に初回だけナビゲーションの高さが狭い

iOS13でモーダルにモーダル（セミモーダル）を重ねた場合のみ発生します。
この件はApple Developer Forumsにもありました。
https://forums.developer.apple.com/message/378841#378841


|初回表示（ナビゲーション下線の位置がおかしい）|2回目以降の表示（こちらが正しい表示）|
| --- | --- |
|![modal_navi_h1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361214/7bf3428c-5813-4cd7-5796-74f9cccea602.png)|![modal_navi_h2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361214/706d6636-581c-65f8-3800-b3eb5324dfc4.png)|

### 【対応内容】

Apple Developer Forumsを参考に、navigationBarのsetNeedsLayout()を呼ぶことで対応しました。viewDidAppearでnavigationBarのsetNeedsLayout()を呼ぶと画面表示時にちらいついたため、viewWillAppearで初回のみ処理を入れています。

```swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    guard #available(iOS 13.0, *), isViewAppeared == false else { return }
    DispatchQueue.main.async { [weak self] in
        self?.navigationController?.navigationBar.setNeedsLayout()
    }
}
```

## 4.iOS13のセミモーダル画面を閉じた後に下の画面のviewDidAppearが呼ばれない

セミモーダル画面だと、モーダル表示元のViewControllerのAppearanceコールバックが変わり、Appearanceコールバックで期待していた動作を見直す必要があります。UIAdaptivePresentationControllerDelegateではモーダル画面の通知がいくつか受け取れるものがiOS13で追加されていますので、そちらで対応する必要がありそうです。

※詳しくは別記事で書いていますので、よろしければご参照ください。
[iOS13のモーダル画面の対応について](https://qiita.com/lanches_hiromi/items/39c5d390b45943c0b1d8)

なお、モーダル画面をフルスクリーン表示にすることで、以前のAppearanceコールバックを期待できるので、モーダル画面についてはフルスクリーンにするという判断もできます。

## 5.地図の著作権表示リンクから、右下の「法律に基づく情報」リンクに変更に伴う対応

Xcode11でビルドするとiOS13で地図の表示が変わります。
iOS12以前で左下に表示されていた著作権表示リンクですが、「法律に基づく情報」のリンクに変わり、位置も右下に変更されています。（左下はアップルのマークと「マップ」の文字になってます。）

### 【対応内容】

私が携わっているアプリの地図では、右下にボタンを配置しており、iOS13で右下に表示される「法律に基づく情報」のリンクと重なってしまってリンクが押せない状態になっていたため、レイアウト調整の対応を行いました。

|iOS12以前の地図|Xcode11ビルドのiOS13の地図|
| --- | --- |
|![map_ios12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361214/bb1de7f3-c3de-c477-9a6e-8e651fc68782.png)|![map_ios13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361214/b18fe205-1dc3-f2b9-88cc-d7437c0e26d2.png)|