iOS:检测设备是否为iPhone X系列(无框架)

Mar*_*ubn 10 iphone uiview ios swift ios11

在我的应用程序中,有一些无框设备的逻辑(iPhoneX,Xs Xs max,Xr).目前它基于设备的模型工作,因此,我通过DeviceKit框架检测模型.

但我想将此逻辑扩展到未来的无框设备.可能在一年内我们将有一些额外的无框设备.那么,我如何检测设备是否无框架?它应该涵盖所有当前的无框设备和未来的设备.

我们不能依赖faceID,safeAreaInset,屏幕高度或大小.那么,那又怎样?

Ben*_*ato 22

你可以"fitler"获得最高级别,例如:

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

  • 这不适用于 statusBarHeight 为 24pt 的 iPad Pro (5认同)

Saa*_*afo 16

支持 Swift 5,iOS 14

感谢 @Tanin 和 @DominicMDev,因为keyWindow was deprecated in iOS 13the iPad Pro has non-zero safeAreaInsets,这对我来说很好用。

(已经在iPhone 8,iPhone 11 ProiPad Pro (11-inch)(2nd gen)模拟器上测试过)

extension UIDevice {
    /// Returns `true` if the device has a notch
    var hasNotch: Bool {
        guard #available(iOS 11.0, *), let window = UIApplication.shared.windows.filter({$0.isKeyWindow}).first else { return false }
        if UIDevice.current.orientation.isPortrait {
            return window.safeAreaInsets.top >= 44
        } else {
            return window.safeAreaInsets.left > 0 || window.safeAreaInsets.right > 0
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 可以确认,对于 UIVindow 的 rootViewController 不起作用,稍后 - 它可以工作 (2认同)

Tan*_*nin 10

因为keyWindow was deprecated in iOS 13,基于keyWindow这里找到的解决方案,这个对我有用

extension UIDevice {
    var hasNotch: Bool {
        if #available(iOS 11.0, *) {
            let keyWindow = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
            return keyWindow?.safeAreaInsets.bottom ?? 0 > 0
        }
        return false
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 5

这对任何方向都有效。无需担心 11.0 之前的 iOS 版本,因为 iPhone X 最低版本为 11.0。来源

extension UIDevice {

    var hasNotch: Bool {
        if #available(iOS 11.0, *) {
           return UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0 > 0
        }
        return false
   }
}
Run Code Online (Sandbox Code Playgroud)