我在 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 但它也不起作用。我附上了图片以澄清我的意思。
我知道如何以编程方式做到这一点,我不是在寻找那个解决方案。我想要的是在 IB 中设置约束,我希望如果其他视图被删除或隐藏,我的子视图将动态移动。是否可以通过自动布局在 IB 中执行此操作?
.....
这是可能的,但你必须做一些额外的工作。首先有一些概念性的事情需要解决:
在您的情况下,这可能意味着:
你需要做的是明智地 过度限制 你的标签。不理会现有的约束(另一个视图的 10pts 空间),但添加另一个约束:使标签的左边缘距其父视图的左边缘 10pts,并具有非必需的优先级(默认的高优先级可能会很好用)。
然后,当您希望它们向左移动时,完全删除左视图。对左视图的强制 10pt 约束将与它相关的视图一起消失,并且您将只剩下一个高优先级约束,即标签距离其父视图 10pts。在下一个布局过程中,这应该会导致它们向左扩展,直到它们填满超级视图的宽度,但要在边缘周围留出间距。
一个重要的警告:如果你想要你的左视图回到图片中,你不仅必须将它添加回视图层次结构,而且你还必须同时 重新建立它的所有约束 。这意味着当视图再次显示时,您需要一种方法将视图及其标签之间的 10pt 间距约束放回原处。