iOS 更改设备方向时违反自动布局约束

iOS autolayout constraint violation when device orientation is changed

我有一个为 iPhone 纵向模式创建的自动版式布局。

当我将设备从纵向旋转到横向时,我收到一条警告,指出系统无法同时满足两个约束。来回旋转时会发生这种情况。

我相信我已经找到了违规约束(下面突出显示),它是由 iOS 生成的,移动我的冲突约束会破坏我的布局并导致更多约束违规错误。

布局直观;只要我忽略警告。

布局由两个基本部分组成,控制部分(使用占设备高度 30% 的 UIStackView)和填充剩余区域的 UITableView。这些嵌入在 UIStackView 中,该 UIStackView 设置为覆盖默认值 UIView,并带有安全区域的边距。

为了充分利用可用屏幕 space 当设备旋转到横向时,控制部分应该从 UITableView 上方到旁边,并占据 45%屏幕宽度。

冲突约束在视图的 "controller" 部分,将其前缘设置为距父视图前缘 16 点。

有办法解决这个问题吗?我也不喜欢,但是警告可以忽略吗?

我试过将主 UIStackView 嵌入到 UIView 中并删除冲突的约束;但他会导致其他问题,除非我在 UIViewUIStackView 之间添加约束,然后它们会出现相同的冲突约束问题。

可以找到具有相同问题的示例项目的回购 at

在简化布局时,我似乎无法将 UIStackViewAlignment = FillDistribution = Fill EquallySpacing = 5(或标准间距)作为间距UIStackView 似乎是。冲突中。

使用 Vary for Traits 时,经常会看到这些类型的约束警告。

您可以通过将 Info Stack View 上的两个比例约束的 Priority 更改为 999 来消除旋转约束冲突。

当我 运行 你的实验应用程序时,我也看到你的 Detail Stack View 上的约束冲突......但是,它看起来像是你可能无法摆脱的内部冲突.将堆栈视图的 Distribution 更改为 Fill Equally 而不是 Fill Proportionally 会清除它,但这可能无法为您提供所需的确切布局。

Fill Proportionally 似乎是最容易被误解和误用的设置...我建议修改您的布局以避免这种情况...可能通过将 Detail Stack View 嵌入 UIView , Distribution: Fill, 并将其限制在 UIView.

的中心