Unityで取得できる Screen.safeAreaには罠(?)がある
罠に遭遇したのは、以下の条件
- 4.7インチiPhone(iPhone6/7など)
- Unity2017.4.35, 2018.4.15
- iOS10
OS | Screen.safeArea.h | Screen.height | ステータスバー高さ |
---|---|---|---|
iOS12 | 1294 | 1334 | 40 |
iOS10 | 1334 | 1334 | 40 |
- iOS11以降だとsafeAreaのRectは正しくステータスバーを避けてくれるが、iOS10だと重なってしまう
原因
- そもそもsafeAreaの導入がiOS11から
- Screen.safeAreaは単純にsafeAreaInsetsをOS判定して取得しているだけだと思われる
- iOS10以下はエラーにならないようにしているだけ?
解決策
- OSを取得して分岐するしかなさそう
- iOS10以下ならiPhoneX系統は存在しないから、ステータスバーは 20 x scale で固定…?
- scaleを取得するにも結局plugin書かないとなので、topLayoutGuide、bottomLayoutGuideあたりを使うのが良さそう
参考
余談
- この記事を検証するにあたってシミュレーターで実行しようとして色々色々罠にハマった…
- 警告に従って、Graphics APIsにGLES3を「追加」すると、シミュレーターでのアプリ起動時に
UnityInitApplicationGraphics
で停止してしまう - 正解は、「追加」ではなく入れ替え(Metalは削除)
- が、ES3に入れ替えたバージョンでiOS13の検証はできたが、iOS10のシミュレーターで実行しようとすると再び
UnityInitApplicationGraphics
で停止 - 未検証だが、ES2にするべきなのかもしれない