Максимальный размер UITableView при соблюдении ограничений автоматического размещения
Итак, что я хочу сделать, это иметь табличное представление, которое максимизирует его размеры при соблюдении ограничений на автоматическое расположение. Прямо сейчас у меня есть табличное представление, которое максимизирует его размер, но его нельзя прокручивать.
public class ExpandingTableView2: UITableView {
override public func reloadData() {
super.reloadData()
self.setNeedsLayout()
self.invalidateIntrinsicContentSize()
}
override public func layoutSubviews() {
super.layoutSubviews()
if !self.bounds.size.equalTo(self.intrinsicContentSize) {
self.invalidateIntrinsicContentSize()
}
}
override public var intrinsicContentSize: CGSize {
self.layoutIfNeeded()
let intrinsicContentSize = super.contentSize
return intrinsicContentSize
}
}
2 ответа
Решение
Вы можете рассчитать высоту просмотра таблицы на основе размера контента, создав выход для ограничения высоты:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableViewHeightConstraint.constant != tableView.contentSize.height && tableViewHeightConstraint.constant < view.frame.height // This will prevent to increase tableview height beyond the view and let it scroll
{
setupHeightConstraintForTableView(tableView.contentSize.height)
}
// rest of the code
}
func setupHeightConstraintForTableView(_ heightValue: CGFloat) {
tableViewHeightConstraint.constant = heightValue
self.updateConstraintsIfNeeded()
}
Здесь важно сохранить ограничения, управляющие максимальной высотой представления таблицы, выше, чем ограничения, используемые для установки его высоты. Я также установил сопротивление сжатию содержимого таблицы: 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()
}
}