以编程方式识别带有缺口的iPhone

时间:2019-04-16 19:28:14

标签: objective-c xcode ios12 iphone-x

我正在尝试以编程方式识别带有缺口的iPhone。我知道screen.size方法,但是当您有一个支持所有界面方向的通用应用程序时,就会变得一团糟(计算所有可能的变化)。因此,我正在寻找一种更简单,更优雅的方法来检测更新的iPhone X机型。

我偶然发现了一种可行的在线方法。在其中,您可以测量安全区域的底部插图,如果它不为零,则可以使用iPhone X机型。从理论上讲这是有道理的,因为安全区域不会到达iPhone X手机的屏幕底部,但会到达所有其他设备。我通过这种方式进行检查:

module Api
  module V1
    class ScheduleSerializer < ActiveModel::Serializer
      attributes :id
    end
  end
end

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

3 个答案:

答案 0 :(得分:2)

Swift 5 和(iOS12 或更高版本)

var isNotch: Bool {
   return (UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0) > 0
}

答案 1 :(得分:1)

针对 Swift 5 和 iOS14 进行了更新

这解决了 keyWindow 弃用警告。

var hasNotch: Bool {
       
 let bottom = UIApplication.shared.windows.first{ $0.isKeyWindow }?.safeAreaInsets.bottom ?? 0
 return bottom > 0
           
    }

答案 2 :(得分:0)

我不得不四处挖掘,但找到了答案(我想向user6788419喊,他的正确答案被另一个线程深深埋葬了。)

首先,以上代码是正确的。检查安全区域的底部插图是否大于零将准确地识别出带有缺口的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
});