隐藏视图时移动其他视图的布局?

我已经在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将自动更新布局

    链接地址: http://www.djcxy.com/p/28241.html

    上一篇: layout to move other views when a view is hidden?

    下一篇: How do I prevent text from being cut off like in UITextView?