使用 iPhone X 时 UIView 约束的行为不同

Posted

技术标签:

【中文标题】使用 iPhone X 时 UIView 约束的行为不同【英文标题】:UIView constraint behaving differently when using iPhone X 【发布时间】:2017-11-06 20:09:22 【问题描述】:

我有一个带有 UITableView 的视图控制器,它占据了大部分屏幕。在视图控制器的底部,我有一个名为 controlViewUIView 和一些按钮。当 viewcontroller 首次加载时,我将管理 controlView 高度的NSLayoutConstraint 设置为 1,以便 controlView 不可见。

@IBOutlet weak var controlViewHeightConstraint: NSLayoutConstraint!
controlViewHeightConstraint.constant = 1.0

当用户点击表格视图单元格时,我调整controlViewHeightConstraint.constant 使其可见

controlViewHeightConstraint.constant = heightConstant  //heightConstant = 65
self.view.layoutIfNeeded()

这在 iphone 5、6、7、8 和 8+ 上运行良好。但是,对于 X,当我在 viewDidLoad 中调用 controlViewHeightConstraint=1 时,controlView 仍然可见。知道为什么它在不可见时出现。

故事板设置

点击单元格前的 iPhone 8+

点击单元格后的 iPhone 8+

点击单元格前的 iPhone X

点击单元格后的 iPhone X

【问题讨论】:

天啊,这么多的大图真的很难看出有什么不同。请把它们变小。 抱歉我一分钟就更新了 你在不同的设备模拟器上使用相同的ios版本吗?其次:您如何定位该 controlView?您是否切换到新的 safeArea 布局约束? @JanBrinker 是的,使用相同版本的 iOS。我在情节提要中设置了位置和所有约束。不确定我是否理解您的最后一个问题 @Brosef:从 iOS 11 开始,有一个名为 safeAreaLayoutGuide 的新布局指南。请参阅此处的文档:developer.apple.com/documentation/uikit/uiview/… 此 layoutGuide 的主要目的是说明 iPhone X 的差异(圆角、凹口、底栏)。所以你似乎只对 iPhone X 有问题,这可能就是原因。检查情节提要中的约束,也许您可​​以将定位更改为safeAreaLayoutGuide。无论如何你都应该用 iPhone X 这样做,但它也可以解决你的问题。 【参考方案1】:

通过将 controlView 的顶部约束默认调整为位于屏幕下方并调整约束以将视图向上移动以使其可见,从而解决了此问题。由于某种原因,调整视图的高度约束不适用于 iPhone X。可能是由于 iPhone X 底部安全区域部分的复杂性。

【讨论】:

以上是关于使用 iPhone X 时 UIView 约束的行为不同的主要内容,如果未能解决你的问题,请参考以下文章

使用 iPhone X 的安全区域指南计算 UIView 的高度

iPhone X 的 UIView 高度没有扩展

在两个 UIView 之间添加更多空间的约束

自定义 UIView 如何响应基于约束的框架变化

UIView 使用约束自动布局居中和调整大小

如何避免 iPhone X 上的视图剪辑