私のアプリには、フレームレスデバイス(iPhoneX、Xs Xs max、Xr)のロジックがあります。現在、デバイスのモデルに基づいて動作するため、DeviceKitフレームワークでモデルを検出します。
しかし、このロジックを将来のフレームレスデバイスに拡張したいと思います。おそらく1年で、追加のフレームレスデバイスが追加されるでしょう。だから、デバイスがフレームレスであるかどうかをどのように検出できますか?現在のすべてのフレームレスデバイスと将来のデバイスをカバーする必要があります。
FaceID、safeAreaInset、画面の高さまたはサイズに依存することはできません。それで、それから何?
次のように、最高のノッチを「フィルター」できます。
var hasTopNotch: Bool {
if #available(iOS 11.0, tvOS 11.0, *) {
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
}
return false
}
これはあらゆる向きに有効です。 iPhone Xの最小バージョンは11.0であるため、11.0より前のiOSバージョンについて心配する必要はありません。 ソース
extension UIDevice {
var hasNotch: Bool {
if #available(iOS 11.0, *) {
return UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0 > 0
}
return false
}
}
これにより、すべての方向をカバーできます。
var hasTopNotch: Bool
{
if #available(iOS 11.0, *) {
var safeAreaInset: CGFloat?
if (UIApplication.shared.statusBarOrientation == .portrait) {
safeAreaInset = UIApplication.shared.delegate?.window??.safeAreaInsets.top
}
else if (UIApplication.shared.statusBarOrientation == .landscapeLeft) {
safeAreaInset = UIApplication.shared.delegate?.window??.safeAreaInsets.left
}
else if (UIApplication.shared.statusBarOrientation == .landscapeRight) {
safeAreaInset = UIApplication.shared.delegate?.window??.safeAreaInsets.right
}
return safeAreaInset ?? 0 > 24
}
return false
}