2019/09/28
iPhoneのsafeAreaを考える
9/20にiPhone 11が出ましたね。買うぞ買うぞと思っていたのですが、
よく考えたら私にはカメラ機能強化なんて必要ないので不要という結論に至りました。バッテリーの持ちが魅力的だったのですが、現状不満もないし。
さて、最近iPhoneのsafeAreaにちょっとだけ悩まされたので紹介しておきます。
ソースコード中でSafeAreaの領域を取得したい場合、UIViewの
safeAreaInsets
プロパティを使用することができます。このプロパティは該当のViewの領域でSafeArea範囲外に当たるInsetsを提示します。Viewの位置や階層によって自動で範囲を再計算してくれるため、非常に便利なプロパティです。ただ、レイアウト確定後のにこちらのプロパティが計算されるため、viewDidLoad
などレイアウト確定前のタイミングではこのプロパティには数値が入らないため、注意しましょう。
上記に記載されている通り、基本的にはsafeAreaInsets
プロパティを使用することで解決します。
ただ、safeAreaInsets
プロパティはviewDidLoadでは取得できません。
viewWillLayoutSubviews以降に書いてあげる必要があります。
【iOS11】safeAreaInsetsの値が取得できるタイミング
それよりも前にどうしてもsafeAreaを考慮する必要がある場合、下記のように対処すると良いです。
/// safeAreaがあるかどうか
static var isSafeArea: Bool {
guard #available(iOS 11.0, *), UIDevice().userInterfaceIdiom == .phone else {
return false
}
switch UIScreen.main.nativeBounds.height {
case 2688: return true //iPhone XS Max/11 Pro Max
case 2436: return true //iPhone X/XS/11 Pro
case 1792: return true //iPhone XR/11
default: return false
}
}