【问题标题】:iOS autolayout constraint violation when device orientation is changed更改设备方向时违反 iOS 自动布局约束
【发布时间】:2019-09-01 07:22:58
【问题描述】:

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

当我将设备从纵向旋转到横向时,我收到一条警告说系统不能同时满足两个约束。当在两个方向之间旋转时会发生这种情况。

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

布局在视觉上起作用;只要我忽略警告。

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

为了在设备旋转到横向时充分利用可用的屏幕空间,控制部分应从UITableView 上方移动到其旁边,并占据屏幕宽度的 45%。

冲突的约束位于视图的“控制器”部分,将其前沿设置为距父视图前沿 16 个点。

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

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

可以在at 找到具有相同问题的示例项目的存储库。

在简化布局时,我似乎无法拥有UIStackViewAlignment = FillDistribution = Fill EquallySpacing = 5(或标准间距),因为UIStackView 上的间距似乎是。冲突。

【问题讨论】:

  • 能否添加警告文本、带有约束的屏幕截图和带有 UI 层次结构的屏幕截图?附加信息应该更容易为您提供帮助。
  • 希望更新有所帮助。我打算尝试整理一个示例项目,看看是否可以以更简单的形式复制它。
  • 查看示例项目,我发现您的 info stack view 是造成警告的原因。您为信息堆栈视图设置了比例高度约束,并且您已将分布指定为Fill Proportionally。这两者相互矛盾。因此,您收到了警告(尽管老实说这是一个误导性的警告)。您可以使用FillFill Equally 分布作为信息堆栈视图,并根据需要调整间距值。
  • @Gavin 我在您的示例项目的存储库中进行了 PR。随意检查一下,以消除无关的约束。
  • 谢谢我已经合并了。我认为最好删除不需要的约束,减少冲突的机会:)

标签: ios autolayout nslayoutconstraint uistackview size-classes


【解决方案1】:

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

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

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

Fill Proportionally 似乎是最容易被误解和滥用的设置...我建议修改您的布局以避免这种情况...可能通过将Detail Stack View 嵌入UIViewDistribution: Fill 并对其进行约束以UIView为中心。

【讨论】:

  • 你说得对,它确实弄乱了我的布局;但至少它搞砸了,没有坏:)谢谢
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多