根据实际需要,您应执行iPhone X的不同检测。
用于处理顶部缺口 (状态栏、导航栏) 等。
class var hasTopNotch: Bool {
if #available(iOS 11.0, tvOS 11.0, *) {
return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 24
}
return false
}
处理底部 home 指示器(tabbar)等问题的方法。
class var hasBottomSafeAreaInsets: Bool {
if #available(iOS 11.0, tvOS 11.0, *) {
return UIApplication.shared.delegate?.window??.safeAreaInsets.bottom ?? 0 > 0
}
return false
}
用于背景大小、全屏功能等。
class var isIphoneXOrBigger: Bool {
// 812.0 on iPhone X, XS.
// 896.0 on iPhone XS Max, XR.
return UIScreen.main.bounds.height >= 812
}
注意:最终将其与UIDevice.current.userInterfaceIdiom == .phone
混合使用
注意:此方法需要有LaunchScreen故事板或适当的LaunchImages。
用于背景比例、滚动特性等方面的处理。
class var isIphoneXOrLonger: Bool {
// 812.0 / 375.0 on iPhone X, XS.
// 896.0 / 414.0 on iPhone XS Max, XR.
return UIScreen.main.bounds.height / UIScreen.main.bounds.width >= 896.0 / 414.0
}
注意:此方法需要具有LaunchScreen storyboard或适当的LaunchImages。
用于分析、统计、跟踪等。
获取机器标识符并将其与文档中的值进行比较:
class var isIphoneX: Bool {
var size = 0
sysctlbyname("hw.machine", nil, &size, nil, 0)
var machine = [CChar](repeating: 0, count: size)
sysctlbyname("hw.machine", &machine, &size, nil, 0)
let model = String(cString: machine)
return model == "iPhone10,3" || model == "iPhone10,6"
}
要将模拟器作为有效的 iPhone X 纳入您的分析中:
class var isIphoneX: Bool {
let model: String
if TARGET_OS_SIMULATOR != 0 {
model = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? ""
} else {
var size = 0
sysctlbyname("hw.machine", nil, &size, nil, 0)
var machine = [CChar](repeating: 0, count: size)
sysctlbyname("hw.machine", &machine, &size, nil, 0)
model = String(cString: machine)
}
return model == "iPhone10,3" || model == "iPhone10,6"
}
要包括 iPhone XS、XS Max 和 XR,只需寻找以 "iPhone11," 开头的型号:
return model == "iPhone10,3" || model == "iPhone10,6" || model.starts(with: "iPhone11,")
为支持面部 ID
import LocalAuthentication
class var canUseFaceID: Bool {
if #available(iOS 11.0, *) {
return LAContext().biometryType == .typeFaceID
}
return false
}