使用“自动布局”独立切换两个内联项的可见性

时间:2015-09-02 23:14:29

标签: ios xcode autolayout

给定以下布局,其中flexible box是,灵活宽度,按钮是固定宽度:

|-[______flexible_box_______]-[button1]-[button2]-|

如何让button1button2独立“隐藏”,只需更改一个约束优先级?

为了说明,布局需要支持以下每种状态:

|-[______flexible_box_______]-[button1]-[button2]-|
|-[___________flexible_box____________]-[button1]-|
|-[___________flexible_box____________]-[button2]-|
|-[________________flexible_box_________________]-|

1 个答案:

答案 0 :(得分:1)

使用iOS 9.0 +,UIStackView会为您解决此问题。隐藏其中一个排列子视图,布局忽略它。再次显示它并返回布局。

在此之前,您可以执行类似这组约束的操作:

  1. |-[box]-(>=standard)-[button1]
  2. |-[box]-(>=standard)-[button2]
  3. |-[box]-(>=standard)-|
  4. [button1]-(>=standard)-[button2]
  5. [button1]-(>=standard)-|
  6. [button2]-(>=standard)-|
  7. |-[box]-(standard@700)-|
  8. (如果你在IB中设置了这个,你可以在编辑约束时选择标准值。否则,你需要用实际值替换"标准" 。)

    约束1-6确保物品保持有序而不重叠。 7号使盒子试图填满整个空间,但优先级降低。如果可以的话,它会占用空间。

    如果隐藏button1,请为约束4和5的常量添加一些巨大的值。(实际上,您可能需要减去该值。我在这里使用的视觉格式语言是不明确的,哪个是第一个项目,这是第二个。)这放松了阻止盒子向右推按钮的障碍,盒子占用了松弛。重新显示它时,反转算术。

    [更新:实际上,最好只是停用约束,而不是捣乱它们的常量。 (将active属性设置为false。)您需要对约束进行强有力的引用,因为它们将从视图中删除,否则会保留它们。]

    同样,如果隐藏button2,则调整约束6。

    每个按钮不是一个约束,但我认为它与你能得到的一样近。