Здесь важно сохранить ограничения, управляющие максимальной высотой представления таблицы, выше, чем ограничения, используемые для установки его высоты. Я также установил сопротивление сжатию содержимого таблицы: 250.
public class ExpandingTableView: UITableView {
@IBOutlet public weak var heightConstraint: NSLayoutConstraint?
override public func reloadData() {
guard let heightConstraint = self.heightConstraint, heightConstraint.priority.rawValue < 750 else { return }
var height: CGFloat = 0.0
for section in 0..<(self.dataSource?.numberOfSections?(in: self) ?? 1) {
for row in 0..<(self.dataSource?.tableView(self, numberOfRowsInSection: section) ?? 0) {
let rowHeight = (self.delegate?.tableView?(self, heightForRowAt: IndexPath(row: row, section: section))) ?? self.rowHeight
height += rowHeight
}
}
heightConstraint.constant = height
super.reloadData()
self.setNeedsLayout()
}
}