新型iPad Pro (2018) のsafeAreaInsetsの値が気になって夜も眠れない

# はじめに

![ipad-rotate_endframe__4c3qbjskaiaq_medium_2x.jpg](https://qiita-image-store.s3.amazonaws.com/0/46227/b9ef0579-5747-ec3d-a933-3ff2ea3dab78.jpeg)

> 画像は[iPad Pro - Apple（日本）](https://www.apple.com/jp/ipad-pro/)より

2018年10月30日に行われた [Apple Special Event](https://www.apple.com/jp/apple-events/october-2018/) にて、新型iPad Pro (2018) が発表されました。
上の画像を見てわかるように、ホームボタンがなくなり、画面の下部に`Home Indicator`を持つ初のiPadの登場となりました。
また、ベゼルが少なくなり、スクリーンの角が丸みを帯びていることがわかります。
これらのことから、今回の新型iPad Pro (2018) は今までの端末には無い新たな`safeAreaInsets`の値のパターンを持っているのではないかと、気になって気になって１日たったの８時間しか眠れなかったのですが、先日リリースされた`Xcode 10.1`に新型iPad Pro (2018) のSimulatorが追加されていましたので、`safeAreaInsets`の値を検証してみることにしました。

# 検証環境
- macOS High Sierra 10.13.6
- Xcode 10.1
- Simulator
    - iPad Pro (11-inch) - iOS 12.1
    - iPad Pro (12.9-inch) (3rd generation) - iOS 12.1

# 検証方法

### 1. プロジェクトの作成
新規プロジェクトの作成で「Single View App」テンプレートから１枚のViewControllerを持ったプロジェクトを作成します。

### 2. 背景色を持ったUIViewをSafeAreaに対して追加
「Main.storyboard」を開き、ViewControllerのview上に白以外の背景色を持ったUIViewを配置し、以下の図のように`Safe Area` (safeAreaLayoutGuide) の各Edge (top, bottom, leading, trailing) に対して、配置したviewの各Edgeとの制約を追加します。

<img width="668" alt="スクリーンショット 2018-11-01 19.18.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/46227/e290dc35-3040-2737-bc6d-d7eec02f1dab.png">

### 3. view.safeAreaInsetsの値をコンソールに出力
「ViewController.swift」を開き、ソースコードを以下のように書き換えます。`override func viewWillLayoutSubviews()`は`ViewController`のライフサイクルの中で最も早く`view.safeAreaInsets`が確定するタイミングなので、この中で出力するようにしています。
あとは実行し、ログを確認することで、`safeAreaInsets`の値がわかります。

```swift:ViewContoller.swift
import UIKit

class ViewController: UIViewController {

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        // `view.safeAreaInsets`の値を出力
        print(view.safeAreaInsets)
    }
}
```

# 検証結果

## safeAreaInsetsの値の変化に関する検証結果
今回の新型iPad Pro (2018) は上下左右ともベゼルの幅が同じため、画面回転やSlideOverによる画面分割を行っても、`safeAreaInsets`の値は **１つの画面構成パターンに対して１つのパターンのみ** になるということがわかりました。
また、`iPad Pro (11-inch)`と`iPad Pro (12.9-inch) (3rd generation)`には`safeAreaInsets`の値の差はありませんでした。

## 画面構成パターン別検証結果

### ViewControllerのみの場合

<img width="1130" alt="スクリーンショット 2018-11-01 18.17.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/46227/6d806f7e-d0f6-ef63-369c-b4e50c96e987.png">


```swift:出力結果
UIEdgeInsets(top: 24.0, left: 0.0, bottom: 20.0, right: 0.0)
```

### NavigationController + ViewControllerの場合

<img width="1129" alt="スクリーンショット 2018-11-01 18.16.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/46227/bd2cea34-9666-89a8-aef2-27387d492a15.png">

```swift:出力結果
UIEdgeInsets(top: 74.0, left: 0.0, bottom: 20.0, right: 0.0)
```
### TabBarController + ViewControllerの場合

<img width="1131" alt="スクリーンショット 2018-11-01 18.20.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/46227/26e98658-46b4-2684-e49c-99af5a6591ec.png">

```swift:出力結果
UIEdgeInsets(top: 24.0, left: 0.0, bottom: 65.0, right: 0.0)
```

### NavigationController + TabBarController + ViewControllerの場合

<img width="1129" alt="スクリーンショット 2018-11-01 18.13.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/46227/8363b8fa-cc94-c3bc-3097-ccf11df3f45d.png">

```swift:出力結果
UIEdgeInsets(top: 74.0, left: 0.0, bottom: 65.0, right: 0.0)
```

## 最後に
今年の9月に発表されたiPhone XS, XS Max, XRと今回発表された新型iPad Pro (2018) の流れを見る限り、今後のAppleの新デバイスはFace IDを活用したホームボタン無しの`Home Indicator`を持ったデバイスがどんどん増えていくと思われます。
そのため、今後のiOSアプリ開発ではSafeAreaを考慮したレイアウトやデザインを意識することが必須となっていくのではないかと思いました。

これで今夜からはぐっすりと眠れそうです。
それでは皆様、おやすみなさい。
最後まで読んでいただき、ありがとうございました。（寝言）