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

366

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

-(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中相同的位置。我尝试将cell.cdView从superview中删除,但也没有起作用。我附加了一张图片以澄清我的意思。

cell

我知道如何通过编程实现这一点,但我不想要那个解决方案。我想要的是在IB中设置约束,并期望我的子视图可以根据其他视图的删除或隐藏而动态移动。是否可能使用自动布局在IB中实现这一点?

.....

更改约束值运行时 - 检查此答案 - Kampai
2
对于这种特定情况,您也可以使用UIStackView。当您隐藏cd时,标签将占据它们的空间。 - Marco Pappalardo
@MarcoPappalardo 这似乎是唯一正确的解决方案。 - Koen
24个回答

0

以下是我如何重新对齐我的UIViews以获得您的解决方案:

  1. 拖放一个UIImageView并将其放置在左侧。
  2. 拖放一个UIView并将其放置在UIImageView右侧。
  3. 在该UIView中拖放两个UILabel,其前导和尾随约束为零。
  4. 将包含2个标签的UIView的前导约束设置为父视图而不是UIImagView。
  5. 如果UIImageView被隐藏,则将前导约束常量设置为10像素到父视图。否则,将前导约束常量设置为10像素+UIImageView.width + 10像素。

我创建了自己的经验法则。每当您必须隐藏/显示任何可能受到影响的约束的uiview时,请将所有受影响/依赖的子视图添加到uiview中,并通过编程方式更新其前导/尾随/顶部/底部约束常量。


0

如果有人需要,我为使用可视化格式约束构建了一个辅助类。我正在我的当前应用程序中使用它。

AutolayoutHelper

它可能有点适合我的需求,但您可能会发现它有用,或者您可能想修改它并创建自己的辅助程序。

我必须感谢Tim提供的上面的答案,这个UIScrollView的答案以及这个教程


0

正确的做法是使用isActive = false禁用约束。但请注意,停用约束会将其移除和释放,因此您必须为它们设置强引用。


0

我认为这是最简单的答案。请验证它是否有效:

        StackFullView.layer.isHidden = true
        Task_TopSpaceSections.constant = 0.   //your constraint of top view

在这里检查https://www.youtube.com/watch?v=EBulMWMoFuw


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接