我试图用编程方式识别带有缺口的iPhone。我知道screen.size方法,但是当你有一个支持所有界面方向的通用应用程序时,它变得一团糟(计算所有可能的变化)。所以我正在寻找一种更简单,更优雅的方式来检测更新的iPhone X型号。
我偶然发现了一个应该可行的在线方法。在其中,您可以测量安全区域的底部插图,如果不是零,则可以使用iPhone X模型。这在理论上是有道理的,因为安全区域不会到达iPhone X手机屏幕的底部,而是在所有其他设备上。我这样检查:
if (@available( iOS 11.0, * )) {
if ([[[UIApplication sharedApplication] keyWindow] safeAreaInsets].bottom > 0) {
// iPhone with notch
}
} else {
// Regular iPhone
}
但是,这不起作用。有人可以在实施中指出我的错误或确认这种方法是否可行?
我不得不四处寻找,但找到了答案(我想向用户6788419大喊大叫,他的正确答案在另一个帖子中深入了解)。
首先,上面的代码是正确的。检查安全区域的底部插入是否大于零将准确识别具有缺口的iPhone(截至本文撰写时)。所以,这是正确的:
if (@available( iOS 11.0, * )) {
if ([[[UIApplication sharedApplication] keyWindow] safeAreaInsets].bottom > 0) {
// iPhone with notch
}
}
但是,将上述语句放在代码中的位置很重要,因为UIWindow在第一个运行循环结束之前不可用。这意味着,如果您在viewDidLoad中或在它结束之前(例如在您的init中)检查缺口,则底部插入将始终为零。
如果您和我一样需要此检查来设置主视图,您可以将所有设置移动到单独的功能(例如postViewDidLoad)并在viewDidLoad结束后调用它:
[self performSelector:@selector(postViewDidLoad) withObject:nil afterDelay:0.0f];
或者,您也可以将其括起来:
dispatch_async(dispatch_get_main_queue(), ^{
// Check notch here
});