隐藏视图时移动其他视图的布局?
我已经在IB设计了自定义Cell,将其分类并将我的网点连接到我的自定义班级。 在单元格内容中有三个子视图:UIView(cdView)和两个标签(titleLabel和emailLabel)。 根据每行可用的数据,有时候我想让UIView和两个标签显示在我的单元格中,有时候只有两个标签。 我想要做的是设置约束,如果我将UIView属性设置为隐藏,或者我将它从超级视图中移除,两个标签将移动到左侧。 我试图设置UIView领先约束为10px的Superview(单元格内容)和UILabels将10px的约束设置为下一个视图(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空间到另一个视图),但是添加另一个约束条件:使标签的左边缘距离其超级视图的左边缘10点以不需要的优先级(默认的高优先级可能工作正常)。
然后,当您希望他们向左移动时,完全移除左侧视图。 左视图的强制性10pt约束将与其相关的视图一起消失,并且只剩下一个高优先级的约束,即标签距离其超视图10点。 在下一个布局过程中,这应该导致它们向左扩展,直到它们填充超视图的宽度,但是在边缘之间的间距。
一个重要的注意事项:如果您想要将左视图重新放入图片中,则不仅必须将其添加回视图层次结构中,还必须同时重新建立所有约束 。 这意味着,无论何时再次显示视图,您都需要一种方法将视图和标签之间的10pt间距约束放回。
在运行时期间添加或删除约束是可能影响性能的重量级操作。 但是,有一个更简单的选择。
对于您想要隐藏的视图,请设置宽度限制。 限制其他观点与这个观点之间的领先水平差距。
要隐藏, .constant
宽度约束的.constant
更新为0.f. 其他视图将自动向左移动以呈现位置。
有关更多详细信息,请参阅我的其他答案
如何在运行时更改标签约束?
对于仅支持iOS 8+的用户 ,有一个新的布尔属性处于活动状态。 这将有助于动态地仅启用所需的约束
PS约束出口必须强大 ,而不是弱
例:
@IBOutlet weak var optionalView: UIView!
@IBOutlet var viewIsVisibleConstraint: NSLayoutConstraint!
@IBOutlet var viewIsHiddenConstraint: NSLayoutConstraint!
func showView() {
optionalView.isHidden = false
viewIsVisibleConstraint.isActive = true
viewIsHiddenConstraint.isActive = false
}
func hideView() {
optionalView.isHidden = true
viewIsVisibleConstraint.isActive = false
viewIsHiddenConstraint.isActive = true
}
此外,要解决故事板中的错误,您需要取消选中这些限制之一的“ Installed
复选框。
UIStackView(iOS 9+)
还有一个选择是在UIStackView
包装你的视图。 一旦隐藏视图UIStackView
将自动更新布局
上一篇: layout to move other views when a view is hidden?
下一篇: How do I prevent text from being cut off like in UITextView?