更改宽度约束会阻止视图与 Superview 的尾随边距对齐

Changing Width Constraint Prevents View from Aligning to Trailing Margin of Superview

首先,我必须提到我在一个新项目中复制了约束并且无法复制问题。这个问题出现在我已经工作了几个月的一个复杂的故事板项目中。

为了简单起见,这基本上是问题所在:

我在视图控制器的默认视图中有一个容器视图。容器视图对其父视图的顶部、底部和尾部边缘有约束。我在超级视图和容器视图之间连接了两个 "equal widths" 约束。一个等于父视图,另一个与父视图成比例,在约束中乘以 0.9。

我有一个按钮叠加在容器视图的顶部,它在 2 "equal/proportional widths" 处于活动状态之间交替(为简单起见,我目前删除了视图控制器中的所有其他对象,以尝试隔离什么导致问题...

当按钮将 "equal widths" 约束切换为 0.9 比例宽度约束时,它 "pushes" 容器视图远离尾部边距(12 点),同时它也会缩小容器视图根据需要增加 10%。

我已经为此工作了几个小时,到目前为止无济于事...出于绝望,我添加了一个额外的后缘约束来打开和关闭,额外的 12 个点来补偿偏移当比例宽度打开时。默认尾随(到 superview)约束设置为 -20,当我将它增加到 -30、-31、-31.5 时,它越来越接近正确,但是当我将它保持在 -32 时,它又跳了起来,大约 12 到 20 点,关闭尾随边缘!我知道这不是尝试解决此问题的好方法,但我想提及它,以防它可能成为比我更了解导致问题的原因的线索..

感谢您提供的任何帮助!

更新:

问题似乎源于容器视图中嵌入的 VC 中的冲突。嵌入式 VC 的高度是 720,而它的容器是 720...但即使我更改了这些高度以匹配,无论哪种方式,我都会遇到同样的问题...

如果我删除嵌入式 VC 并只使用容器视图,问题似乎就消失了,但这不是解决方案,因为我需要嵌入式 VC 的内容...

最后一点,我有一个类似的方法,按下按钮可以改变嵌入的高度 VC,但没有问题..

我以前遇到过类似的约束问题,没有看故事板我无法确定确切原因,但您可以尝试以下方法:

  • 仔细检查您的约束是否已连接到您的代码,即使它们不是,代码也会编译并且 运行 但没有任何效果。
  • 注意自动布局破坏约束的日志,可能存在另一个限制您的视图的约束,导致新激活的视图被破坏。

如果两者都不是原因,还要检查按钮是否调用了正确的操作。

无论如何,如果我的提示根本没有帮助,您可能需要提供更多信息或显示视图的屏幕截图以及它的限制,以便从我的角度更好地理解您的问题。

我解决了!

因此,正如我在更新中所怀疑的那样,问题源于容器视图与其嵌入式视图控制器之间的约束不同步。如上所述,在容器视图中,父视图的后缘有一个约束,我用按钮切换的宽度有 2 个约束。嵌入式视图控制器的视图对其父视图有一个主要约束。一旦我删除它并将其也切换为尾随视图,问题就解决了!

经验教训:如果您要更改具有多个宽度或高度约束的容器视图,请确保容器视图和嵌入视图的内容(y 轴的顶部或底部,前导或尾随 x 轴)。