自动布局无法正确处理iPhone X缺口

时间:2018-02-03 19:09:50

标签: swift autolayout constraints iphone-x pagecontrol

我已经使用swift在我的应用程序顶部实现了一个pageViewIndicator。我一直在我的个人iPhone上进行测试,但是当我使用iPhone X模拟器时,我注意到它消失在缺口后面,仅仅是因为我没有提到它放在安全区域或安全区域是尚未正确配置。以下是比较:

pageController on iPhone 8 pageController on iPhone X

这似乎是一个简单的问题,但我目前还没有找到任何关于如何处理这个问题的适当支持:主要建议是调整safeAreaInsets,但我不明白如何将其应用于AutoLayout功能。我已经尝试将topAnchor约束添加到pageController,但是甚至可以使用基本算法编辑它吗?

pageControl.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true

3 个答案:

答案 0 :(得分:2)

没有必要"调整"任何东西。安全区域的整个是它的顶部位于非X iPhone上的状态栏下方,并且位于"下面#34;在iPhone X上。这就是 for 的安全区域。

因此,只需将页面控件的顶部固定在安全区域的顶部即可。以下是iPhone 5s模拟器的外观:

enter image description here

以下是它在iPhone X模拟器上的外观:

enter image description here

答案 1 :(得分:1)

我当前正在升级的应用程序中存在相同的问题。它在主屏幕的右侧具有一列按钮。在横向切槽右侧的情况下,按钮会被部分切除。我不想移动按钮,因为这将大大减小消息区域左侧的尺寸,尤其是在纵向模式下。

我没有在Xcode中看到与“安全区域”相对应的约束,也不想进入动态定位的兔子洞,所以我的解决方案是将方向限制为纵向和横向向右(表示左侧有缺口)。

如果我们对每个设备类型的方向进行限制,但不屏住呼吸,那就太好了。

希望几年后,这种丑陋的时髦逐渐消失。

答案 2 :(得分:0)

我发现了我的问题,实际上我只是监督了这个问题:我忘了添加

pageControl.translatesAutoresizingMaskIntoConstraints = false

到pageControl,然后将其添加为子视图。有了这个,我能够分配以下约束来正确定位我想要的pageController:

let safeViewMargins = self.view.safeAreaLayoutGuide
pageControl.topAnchor.constraint(equalTo: safeViewMargins.topAnchor).isActive = true
pageControl.leadingAnchor.constraint(equalTo: safeViewMargins.leadingAnchor).isActive = true
pageControl.trailingAnchor.constraint(equalTo: safeViewMargins.trailingAnchor).isActive = true

然后完全在所有设备上运行。