创建预期的 UI 行为,同时也不会收到破坏约束警告

Posted

技术标签:

【中文标题】创建预期的 UI 行为,同时也不会收到破坏约束警告【英文标题】:Create Intended UI Behavior While Also Not Getting Breaking Constraints Warnings 【发布时间】:2018-02-25 00:24:32 【问题描述】:

我对 UIView 中的水平 stackView 有一个高度限制,我会根据视图的内容进行更改。如果 stackView 中某个标签的文本超出一定大小,则约束移动到 116.33,否则为 96。此水平 stackView 固定到此 UIView 的顶部。

在运行时,我收到此约束被破坏的警告,但我得到了预期的操作:

如果我删除约束“Horizo​​ntal Stack View.top = top”,不会出现警告,但我没有得到预期的操作:

我已经尝试通过 locationView.frame.size.height 相应地更改 UIView 的高度,以及向视图添加另一个约束,具体来说,并以与我调整 stackView 高度约束相同的方式进行调整,但是产生的行为本质上是相同的。

这是文档大纲:

我怎样才能得到预期的效果,同时也让 XCode 开心?

【问题讨论】:

避免约束问题的最佳方法是根本不使用它们。我敢肯定,到目前为止,您已经花了很多时间来弄乱您的视图,但是计算数学并以编程方式设置框架并在框架应该更改时创建事件将花费更少的时间。 如果将 Stackview 高度约束 = 96 的优先级降低到小于 1000 会怎样? 您也可以尝试将 Stackview height == 96 约束更改为 Stackview height >= 96。 @Pigpocket 看起来高度约束之一需要是 >= 或完全删除,并让堆栈视图的固有高度确定高度。我建议在调试时暂停并进入视图层次调试器。见此链接:developer.apple.com/library/content/documentation/… 您的堆栈视图已对齐顶部和底部,但一个具有 96 的高度约束,另一个具有 >= 136 的高度约束。两者都不能满足。摆脱其中一个。 【参考方案1】:

我是这样解读您的 4 个相互冲突的约束的:

    StackView 的水平高度为 96。 Horizo​​ntal StackView 和 Vertical StackView 在其顶部对齐。 Horizo​​ntal StackView 和 Vertical StackView 底部对齐。 垂直 StackView 高度 >= 136。

所以 StackViews 的高度是相同的,因为它们的顶部和底部是对齐的。但是他们每个人都有自己的限制来设置他们的高度。

我建议摆脱 StackView 高度限制之一。

【讨论】:

以上是关于创建预期的 UI 行为,同时也不会收到破坏约束警告的主要内容,如果未能解决你的问题,请参考以下文章

如何消除“前导和尾随约束……已经存在中心约束”警告

自动布局隐藏第一次启动的图像

使用 NSLayoutConstraints 时的警告

以编程方式向 Swift 中的视图添加约束时出错

为动态单元设置约束

单元格中的破坏约束