Ger*_*acs 8 xcode objective-c iphone-x ios12
我正在尝试以编程方式识别带有缺口的 iPhone。我知道 screen.size 方法,但是当你有一个支持所有界面方向的通用应用程序时,它会变得一团糟(计算所有可能的变化)。因此,我正在寻找一种更简单、更优雅的方法来检测较新的 iPhones X 型号。
我在网上偶然发现了一种应该有效的方法。在其中,您测量安全区域的底部插图,如果它不为零,则您拥有 iPhone X 型号。这在理论上是有道理的,因为安全区域不会到达 iPhone X 手机的屏幕底部,但会在所有其他设备上到达。我是这样检查的:
if (@available( iOS 11.0, * )) {
if ([[[UIApplication sharedApplication] keyWindow] safeAreaInsets].bottom > 0) {
// iPhone with notch
}
} else {
// Regular iPhone
}
Run Code Online (Sandbox Code Playgroud)
然而,这行不通。有人可以指出我在实施中的错误或确认这种方法是否可行吗?
Ger*_*acs 11
我不得不四处挖掘,但找到了答案(我想向 user6788419 大声喊叫,他的正确答案在另一个线程中深藏不露)。
首先,上面的代码是正确的。检查安全区域的底部插图是否大于零将准确识别带有缺口的 iPhone(在撰写本文时)。所以,这是正确的:
if (@available( iOS 11.0, * )) {
if ([[[UIApplication sharedApplication] keyWindow] safeAreaInsets].bottom > 0) {
// iPhone with notch
}
}
Run Code Online (Sandbox Code Playgroud)
但是,将上述语句放在代码中的位置很重要,因为在第一个运行循环结束之前 UIWindow 不可用。这意味着,如果您在 viewDidLoad 中或在它结束之前(例如在您的 init 中)检查缺口,则底部插入将始终为零。
如果你和我一样,需要这个检查来设置你的主视图,你可以将所有设置移动到单独的函数中(例如 postViewDidLoad)并在 viewDidLoad 结束后调用它:
[self performSelector:@selector(postViewDidLoad) withObject:nil afterDelay:0.0f];
Run Code Online (Sandbox Code Playgroud)
或者,您可以将其附上:
dispatch_async(dispatch_get_main_queue(), ^{
// Check notch here
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3516 次 |
最近记录: |