如何检测iPhone X的Home指示器?

4
新款iPhone X取消了原有的Home键,改为在底部设置了一个“主页指示器”,用户可以向上滑动以返回主屏幕。
我的问题是,我们如何检测主页指示器是否在屏幕上?我想要实现这样的功能:
if (!notfullScreen)
{
    if (swipeBarExists)
    {
        viewHeight -= swipeBarHeight;
    }
}

我在检查[UIApplication sharedApplication]时没有找到任何内容。基本上我真的不知道应该称呼这个东西,也很难找到答案。


2
请查看safeAreaInsets,它包含屏幕此区域占用的空间。 - Jordan Smith
1
苹果似乎非常清楚,我们不应该编写这样的代码。请看 https://developer.apple.com/videos/play/fall2017/801/。 - Ashley Mills
@Ser Pounce 我没有在这方面工作过,但是下面的链接可能会有用 https://medium.com/the-traveled-ios-developers-guide/iphone-x-dealing-with-home-indicator-2e8e47f5647f - Gagan_iOS
是的,我意识到他们现在可能希望以不同的方式完成这个任务,但我只是想寻找一个快速解决方案,可以覆盖我的当前代码。 - Ser Pounce
1个回答

14

您可以利用 UIView 中定义的 safeAreaInsets.bottom 来获取您应该缩进内容的空间量,以确保它不会与主屏幕指示器(或其他元素)重叠。请注意,例如在 iPhone 上旋转到横向时,此值可能会发生变化并缩小。要在发生这种情况时得到通知,请在您的视图控制器中实现 safeAreaInsetsDidChange。您还可以使用自动布局和 safeAreaLayoutGuide

因此,如果您有一个全屏视图,您可以这样检查:

override func viewSafeAreaInsetsDidChange() {
    super.viewSafeAreaInsetsDidChange()

    if view.safeAreaInsets.bottom > 0 {
        //home indicator
    } else {
       //no home indicator
    }
}

请注意,目前没有API可以仅获取主页指示器栏本身的高度。


2
我发现安全区域太大了,这会让你的应用看起来像是模拟的iOS 10应用程序。实际上,在顶部和底部的斜面开始后,它会移除所有的空间。我使用了传统的方法来检测iPhone X,并在底部留出了一点空间以供指示器使用。虽然不是很完美,但对我来说很有效,可以让我的应用程序看起来现代化,并且在我不使用iPhone X时也可以覆盖它。 - absmiths
1
感谢您的回复,但重新审视一下,这只会给您安全区域插图的底部,而不是主页指示器的高度。安全区域插图的底部可能包括选项卡栏、工具栏或任何苹果未来决定添加的其他内容。 - Ser Pounce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接