web-dev-qa-db-fra.com

iOS: Détectez si l'appareil est de la famille iPhone X (sans cadre)

Dans mon application, il existe une logique pour les appareils sans cadre (iPhoneX, Xs Xs max, Xr). Actuellement, cela fonctionne sur la base du modèle des appareils, donc je détecte le modèle par le framework DeviceKit.

Mais je veux étendre cette logique aux futurs appareils sans cadre. Probablement dans un an, nous aurons des appareils sans cadre supplémentaires. Alors, comment puis-je détecter si l'appareil est sans cadre ou non? Il devrait couvrir tous les appareils sans cadre actuels et futurs.

Nous ne pouvons pas compter sur faceID, safeAreaInset, la hauteur ou la taille de l'écran. Alors quoi?

10
Mark cubn

Vous pouvez "filtrer" pour le top, quelque chose comme:

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

Ceci est valable pour n'importe quelle orientation. Pas besoin de s'inquiéter de la version iOS avant 11.0 puisque la version minimale de l'iPhone X est 11.0. Source

extension UIDevice {

    var hasNotch: Bool {
        if #available(iOS 11.0, *) {
           return UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0 > 0
        }
        return false
   }
}
1
beatrizanso

De cette façon, vous pouvez couvrir toutes les orientations:

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