web-dev-qa-db-ja.com

iOS:デバイスがiPhone Xファミリー(フレームレス)かどうかを検出します

私のアプリには、フレームレスデバイス(iPhoneX、Xs Xs max、Xr)のロジックがあります。現在、デバイスのモデルに基づいて動作するため、DeviceKitフレームワークでモデルを検出します。

しかし、このロジックを将来のフレームレスデバイスに拡張したいと思います。おそらく1年で、追加のフレームレスデバイスが追加されるでしょう。だから、デバイスがフレームレスであるかどうかをどのように検出できますか?現在のすべてのフレームレスデバイスと将来のデバイスをカバーする必要があります。

FaceID、safeAreaInset、画面の高さまたはサイズに依存することはできません。それで、それから何?

10
Mark cubn

次のように、最高のノッチを「フィルター」できます。

var hasTopNotch: Bool {
    if #available(iOS 11.0, tvOS 11.0, *) {
        return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
    }
    return false
}
21
Bence Pattogato

これはあらゆる向きに有効です。 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
   }
}
1
beatrizanso

これにより、すべての方向をカバーできます。

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
}
1
Ahmad Bazian