自动布局如何在具有3个相等宽度视图的视图中隐藏1个视图

时间:2016-07-14 02:29:20

标签: ios swift autolayout

目前我在1个视图中有3个视图(固定在superview的前缘和后缘)。

3个观点目前看起来像这样:

3 views with equal widths

但是,在某些情况下,我希望隐藏靛蓝视图,但仍保持最后2个相同的宽度,如下所示: 2 views with equal widths with indigo view hiding

如何通过自动布局实现此目的?或者我如何使用IBOutlets实现约束?

3 个答案:

答案 0 :(得分:8)

如果部署目标是iOS9或更高版本,建议使用UIStackView作为封闭视图。在isHidden中排列的任何视图上将true设置为UIStackView不仅会隐藏视图,而且堆栈视图也会重新组织所有非隐藏视图以填充隐藏视图占用的空间。可以通过调整distribution上的UIStackView来调整此行为。

Tj3n的答案有效,但它有一个缺点,你必须在你的代码中使用幻数,并在代码和IB中设置约束属性。

恕我直言,更好的解决方案是在IB中设置具有不同优先级的所有约束,并在代码中激活/停用它们。试试这个:

  1. 像以前一样设置前导/尾随约束。
  2. 为所有三个视图设置等宽度约束,优先级为high
  3. 为优先级为required的所有三个视图设置0宽度约束,但在IB中将其停用。并将它们连接到代码中的IBOutlet,就像连接视图一样。
  4. 激活任何0宽度约束以折叠所需视图,然后停用它们以进行展开。
  5. 请注意,只需使用1和2,就可以实现等宽视图布局。使用3和4,您可以选择性地折叠/展开任何视图。

答案 1 :(得分:2)

它非常简单,你可以为3视图创建相等宽度约束A,设置其优先级为998,然后为它们创建另一个单宽度约束B1,B2,B3,设置优先级为997,如果要隐藏任何在3视图中,将B约束的常量设置为0,并将其优先级设置为999,然后调用self.view.layoutIfNeeded,视图将隐藏,其他视图将缩放

测试约束是灰色视图的宽度约束: enter image description here

答案 2 :(得分:0)

如果始终是隐藏的靛蓝视图,您应该通过添加此约束来解决您的问题:

靛蓝视图:导致superview +尾随到purpleView +宽度约束

紫色视图:与grayView相同的宽度

灰色视图:导致purpleView +尾随到superview

看起来应该是这样的:

Constraints

View

如果你改变了indigoView的width属性,所有都应该正确遵循。

希望能帮助你。