我应该如何以编程方式更新动态视图的约束?

时间:2017-10-24 10:39:18

标签: ios uiview constraints

我想了解更新视图/约束的最佳做法,以获得具有多个可能(可见)子视图的动态视图。在这个简单的例子中,假设我想要一个自定义 UITableViewCell,可能有两个'状态',一个带有标题和正文标签,另一个只有正文标签,如下面的图片。 重要:我不是在寻找创建这两种状态的方法,这只是一个例子。我知道常规单元格有subtitle可以达到这个目的,但我真正的问题更复杂。

第一个州:

First state

第二州:

Second state

一种选择是将这两个单元格创建为单独的单元格,但我想知道是否有任何“接受”的方法来制作单个单元格(第一个单元格)并让它以各种状态显示 - 最好不要处理一吨的程序化状态。

首先,我假设两个标签都必须限制在单元格本身的顶部边缘。如果我不这样做,两个国家都不可能,对吧?或者是否有另一种方法可以从第一个视图获得第二个状态?

如何设置约束,以及如何在代码中处理它们 - 以实现具有不同布局的单个视图?

3 个答案:

答案 0 :(得分:5)

堆栈视图可以帮助您解决此问题。如果隐藏其中一个已排列的子视图,它们会自动调整其内在大小,因此在上面的示例中,您将在堆栈视图中同时具有两个标签,并使用约束将堆栈视图固定到单元格。

如果隐藏标题标签,正文文本标签将移动到正确的位置(取决于堆栈视图中的设置)。

如果您正在使用自动调整单元格并且您正在从堆栈视图中确定单元格高度,那么单元格也将正确调整其高度。

对于具有可选视图的复杂问题,堆栈视图是一个很好的解决方案,需要其他视图来调整其位置。

答案 1 :(得分:1)

到目前为止,在这两种不同状态之间进行更改的最简单方法是使用UIStackView。 (UIStackView也应该是您创建布局的默认工具。)

创建一个垂直堆栈视图,用于排列headerLabelbodyLabel

设置堆栈视图的layoutMarginsspacing以满足您的需要。

然后在两者之间进行更改,您只需在isHidden上设置headerLabel

然后,堆栈视图将为您完成所有操作。

答案 2 :(得分:0)

除了使用StackViews,在某些情况下肯定是最好的选择(老实说,我不知道)我想使用约束来提供替代方案:

我会按照以下方式进行。假设带有粗体文本的文本称为 big ,另一个名为 small

  • 的一个约束添加到顶部(C1)
  • 的一个约束添加到(C2)
  • 的一个约束添加到顶部(C3)
  • 在状态一中,可见,C2和C3启用,C1禁用
  • 状态二中不可见,C1和C3启用,C2禁用。

为此,您需要将标签和C1和C2通过插座连接到您的代码。