小编典典

隐藏视图时如何使用自动布局移动其他视图?

all

我在 IB 中设计了我的自定义单元,将其子类化并将我的插座连接到我的自定义类。我在单元格内容中有三个子视图,它们是:UIView (cdView)
和两个标签(titleLabel 和 emailLabel)。根据每行可用的数据,有时我希望在单元格中显示 UIView
和两个标签,有时只显示两个标签。如果我将 UIView 属性设置为隐藏,或者我将从超级视图中删除它,那么我想要做的是设置约束,这两个标签将向左移动。我尝试将
UIView 前导约束设置为 Superview(单元格内容)为 10px 和 UILabels 前导约束为 10 px
到下一个视图(UIView)。稍后在我的代码中

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(IndexPath *)indexPath {

    // ...

    Record *record = [self.records objectAtIndex:indexPath.row];

    if ([record.imageURL is equalToString:@""]) {
         cell.cdView.hidden = YES;
    }
}

我隐藏了我的 cell.cdView,我希望标签向左移动,但它们在 Cell 中的位置相同。我试图从 superview 中删除 cell.cdView
但它也不起作用。我附上了图片以澄清我的意思。

cell

我知道如何以编程方式做到这一点,我不是在寻找那个解决方案。我想要的是在 IB
中设置约束,我希望如果其他视图被删除或隐藏,我的子视图将动态移动。是否可以通过自动布局在 IB 中执行此操作?

.....

阅读 128

收藏
2022-03-30

共1个答案

小编典典

这是可能的,但你必须做一些额外的工作。首先有一些概念性的事情需要解决:

  • 隐藏的视图,即使它们不绘制, 仍然参与 自动布局并通常 保留它们的框架 ,将其他相关视图留在它们的位置。
  • 当从其父视图中删除视图时, 所有相关的约束 也会从该视图层次结构中删除。

在您的情况下,这可能意味着:

  • 如果您将左视图设置为隐藏,则标签将保留在原位,因为该左视图仍在占用空间(即使它不可见)。
  • 如果您删除左视图,您的标签可能会受到模棱两可的约束,因为您不再有标签左边缘的约束。

你需要做的是明智地 过度限制 你的标签。不理会现有的约束(另一个视图的 10pts 空间),但添加另一个约束:使标签的左边缘距其父视图的左边缘
10pts,并具有非必需的优先级(默认的高优先级可能会很好用)。

然后,当您希望它们向左移动时,完全删除左视图。对左视图的强制 10pt 约束将与它相关的视图一起消失,并且您将只剩下一个高优先级约束,即标签距离其父视图
10pts。在下一个布局过程中,这应该会导致它们向左扩展,直到它们填满超级视图的宽度,但要在边缘周围留出间距。

一个重要的警告:如果你想要你的左视图回到图片中,你不仅必须将它添加回视图层次结构,而且你还必须同时 重新建立它的所有约束
。这意味着当视图再次显示时,您需要一种方法将视图及其标签之间的 10pt 间距约束放回原处。

2022-03-30