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?
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
}
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
}
}
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
}