使用Notch以编程方式识别iPhone

问题描述 投票:0回答:1

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

但是,这不起作用。有人可以在实施中指出我的错误或确认这种方法是否可行?

objective-c xcode ios12 iphone-x
1个回答
0
投票

我不得不四处寻找,但找到了答案(我想向用户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
});
© www.soinside.com 2019 - 2024. All rights reserved.