iOS: определите, относится ли устройство к семейству iPhone X (без рамки) - PullRequest
0 голосов
/ 19 сентября 2018

В моем приложении есть логика для безрамочных устройств (iPhoneX, Xs Xs max, Xr).В настоящее время он работает на основе модели устройств, поэтому я определяю модель с помощью инфраструктуры DeviceKit.

Но я хочу распространить эту логику на будущие безрамочные устройства.Возможно, через год у нас появятся дополнительные безрамочные устройства.Итак, как я могу определить, является ли устройство бескаркасным или нет?Он должен охватывать все текущие безрамные устройства и будущие.

Мы не можем полагаться на faceID, safeAreaInset, высоту экрана или размер.И что тогда?

Ответы [ 3 ]

0 голосов
/ 01 мая 2019

Таким образом, вы можете охватить все ориентации:

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
}
0 голосов
/ 30 мая 2019

Это действительно для любой ориентации.Не нужно беспокоиться о версии iOS до 11.0, так как минимальная версия iPhone X - 11.0. Источник

extension UIDevice {

    var hasNotch: Bool {
        if #available(iOS 11.0, *) {
           return UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0 > 0
        }
        return false
   }
}
0 голосов
/ 19 сентября 2018

Вы могли бы "соответствовать" для высшей ступени, что-то вроде:

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