[iPhone] safeAreaInsets をコードで取得してSafeAreaに対応する

iPhone X以降では画面のアスペクトレシオが 2:1 の横長モデルも発売され、SafeAreaという概念が登場しました。四隅は角丸、上下左右のマージン、ステータスバー、ホームインジケータ等々を考慮する必要が出てきました。


Swift 5.1
Xcode 11.4

SafeArea

SafeAreaを考慮せずに放っておいて実際に困ることは、ステータスバーやホームインジケータにボタンや文字が被りユーザーからは使いにくいアプリとなってしまいます。

Appleもそこは適切な対応を求めています。特に広告は致命的ですね。

safeAreaInsets

Storyboardで設定する方法は他にありますが、ここでは動的にコードでSafeAreaの取得と画面回転のケースを想定してみたいと思います。

SafeArea上下左右は safeAreaInsets から取得することができます。ただしこれは viewDidLoadでは受け取れず、その後の viewDidAppear で受け取れます。(この前でも取れるようですが)

PortraitではSafeAreaと画面に上に44.0, 下に34.0の余白があります。
例)iPhone X



また、画面が回転するときは
viewSafeAreaInsetsDidChange()で回転後のサイズを取り出せますが
willAnimateRotation()でも可能です。

サンプルコード

これらのSafeAreaを計算するコードです。

ViewController.swift

サンプル動画

画面を傾けて、あるいはSimulatorのDeviceから画面を回転させてください。

 




References:
safeAreaInsets — UIView | Apple Developer Documentation
Positioning Content Relative to the Safe Area | Apple Developer
UIEdgeInsets — UIKit | Apple Developer Documentation
iPhone X用にアプリケーションをアップデートする — iOS — Apple Developer
iPhone X — Overview — iOS Human Interface Guidelines