I have designed my custom Cell in IB, subclassed it and connected my outlets to my custom class. I have three subviews in cell content which are: UIView (cdView) and two labels (titleLabel and emailLabel). Depending on data available for each row, sometimes I want to have UIView and two labels displayed in my cell and sometimes only two labels. What I am trying to do is to set constraints that way if I set UIView property to hidden or I will remove it from superview the two labels will move to the left. I tried to set UIView leading constraint to Superview (Cell content) for 10px and UILabels leading Constraints for 10 px to the next view (UIView). Later in my code

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

    Record *record = [self.records objectAtIndex:indexPath.row];
    
    if ([record.imageURL is equalToString:@""]) {
         cell.cdView.hidden = YES;
    }
}

我把手机藏起来了。cdView和我想要标签移动到左边,但他们在细胞中保持相同的位置。我试着移除细胞。cdView从superview,但它也没有工作。我附上了图片,以澄清我是什么。

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

.....

当前回答

使用两个UIStackView水平和垂直,当堆栈中的某些子视图视图被隐藏时,其他堆栈子视图将被移动,使用Distribution ->按比例填充垂直堆栈中的两个uilabel,并需要设置宽度和高度约束的第一个UIView

其他回答

以下是我如何重新对齐我的uiviews来得到你的解决方案:

拖拽一个UIImageView放到左边。 拖拽一个UIView并把它放到UIImageView的右边。 在UIView中拖放两个uilabel,它的前导约束和尾随约束为零。 将包含2个标签的UIView的前置约束设置为superview而不是UIImagView。 如果UIImageView被隐藏,设置前置约束常量为10像素到superview。ELSE,设置前置约束常量为10px + UIImageView。宽度+ 10像素。

我自己制定了一个拇指规则。当你必须隐藏/显示任何约束可能受到影响的uiview时,在uiview中添加所有受影响/依赖的子视图,并以编程方式更新其前/后/上/下约束常量。

在运行时期间添加或删除约束是会影响性能的重量级操作。然而,有一个更简单的选择。

对于希望隐藏的视图,设置宽度约束。用一个领先的水平间隙约束其他视图到该视图。

要隐藏,请将width约束的.常量更新为0.f。其他视图将自动向左移动以占据位置。

更多细节请看我的另一个答案:

如何在运行时改变标签约束?

当set hidden = YES时,将uiview和标签之间的约束连接为IBOutlet,并将优先级成员设置为较小的值

当你想隐藏UIView时,创建width约束并将其更改为0,而不是隐藏view。

这可能是最简单的方法。此外,它将保存视图,如果您想再次显示它,则不需要重新创建它(在表单元格中使用非常理想)。要更改常量值,您需要创建一个常量引用出口(与为视图创建出口的方式相同)。

正确的方法是禁用isActive = false的约束。但是请注意,取消激活约束会删除并释放它,因此必须为它们提供强出口。