使用Notch以编程方式识别iPhone

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Notch以编程方式识别iPhone相关的知识,希望对你有一定的参考价值。

我试图用编程方式识别带有缺口的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
});

以上是关于使用Notch以编程方式识别iPhone的主要内容,如果未能解决你的问题,请参考以下文章

iPhone X 和 Notch 检测

如何以编程方式检测 iPhone 6 和 6 Plus 视图模式 [重复]

以编程方式将按钮添加到片段

使用 Pygments 检测代码片段的编程语言

以编程方式替换片段

以编程方式检索 iPhone 上的内存使用情况