iOS 如何在不删除约束的情况下调整具有不同内容的 tableView 单元格的大小

How to get resizing tableView cell with different content without deleting constraints in iOS

我在一个单元格中有一个包含不同内容(视图、标签、图像视图)的 tableView 单元格。但是在某些单元格中内容可能不完整。我如何在不删除和添加始终约束的情况下使用调整单元格大小?谢谢。

Ray Wenderlich 有一个关于 table 单元格动态大小的精彩教程,可在此处找到: https://www.raywenderlich.com/129059/self-sizing-table-view-cells

TL;DR 您需要确保单元格的内容在单元格内容视图的所有四个边上都固定,并设置为高优先级垂直拥抱,大于或等于标签上的高度限制。

此问题的可能解决方案之一:

  1. 为优先级为 1000 的隐藏状态添加约束
  2. 为具有较低优先级(例如 750)的已调整状态添加额外约束
  3. 的隐藏状态约束保存到IBOutlet 集合
  4. ONLY 的约束保存到另一个 IBOutlet 集合中

代码:

@IBOutlet var hiddenConstraints: [NSLayoutConstraint] = []
@IBOutlet var visibleConstraints: [NSLayoutConstraint] = []

func hide(_ hide: Bool) {

    for hiddenConstraint in self.hiddenConstraints {
        hiddenConstraint.isActive = hide
    }

    for visibleConstraint in self.visibleConstraints {
        visibleConstraint.isActive = !hide
    }

    self.layoutIfNeeded()
}

有更快的解决方案:

  1. 将可以隐藏的内容移动到容器视图中
  2. 设置容器视图的高度限制
  3. 如果隐藏则从代码高度约束常量更改为 0,如果可见则更改为适当的高度

代码:

@IBOutlet var heightConstraint: NSLayoutConstraint!

func hide(_ hide: Bool) {

    self. heightConstraint.constant = hide ? 0 : 150  //Estimated height

    self.layoutIfNeeded()
}

这不是一个好方法,因为它会导致约束在运行时崩溃。所以我更喜欢用第一个。

此外,您还需要从 table 更新您的单元格,以便向上或向下移动其他单元格。