Я столкнулся с проблемой при использовании UITableViews.

Для AutoLayout требуется фиксированное ограничение высоты для UITableView, поэтому Высота не меняется при добавлении или удалении TableViewCells.

Моя проблема в том, что я использую TableView внутри и ScrollView. Это не очень хорошо, так как оба элемента можно прокручивать .

Мой план состоит в том, чтобы всегда изменять размер TableView в зависимости от его высоты содержимого. В этом случае TableView может никогда не прокручиваться .

Моя идея до сих пор заключалась в следующем, но по какой-то причине она не работает на самом деле:

tableView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: tableView.contentSize.height)

Если у вас есть какие-либо идеи о том, как это исправить, прокомментируйте ниже. Более простые решения без расширений классов и т. д. являются предпочтительными;)

Большое спасибо, ребята!

0
christophriepe 30 Апр 2020 в 13:53

2 ответа

Вы можете использовать что-то вроде:

final class AutoSizingTableView: UITableView {

    override init(frame: CGRect, style: UITableView.Style) {
        super.init(frame: frame, style: style)
        setContentCompressionResistancePriority(.required, for: .vertical)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setContentCompressionResistancePriority(.required, for: .vertical)
    }

    override var contentSize: CGSize {
        didSet {
            invalidateIntrinsicContentSize()
        }
    }

    override func reloadData() {
        super.reloadData()
        invalidateIntrinsicContentSize()
    }

    override var intrinsicContentSize: CGSize {
        setNeedsLayout()
        layoutIfNeeded()
        return contentSize
    }
}

По сути, это устанавливает intrinsicContentSize равным contentSize при перезагрузке данных табличного представления или при изменении contentSize.

Однако вы должны задать себе вопрос: если мне не нужна логика снятия блокировки, нужен ли мне действительно просмотр таблицы?

0
Sander Saelmans 30 Апр 2020 в 11:24

Вам необходимо переопределить метод updateViewConstraints() в вашем UIViewController и установить новую высоту tableView следующим образом:

override func updateViewConstraints() {
    tableViewHeightConstraint?.constant = tableView.contentSize.height
    super.updateViewConstraints()
}

И звоните self.view.setNeedsUpdateConstraints(), когда вам нужно воссоздать ваш tableView с новой высотой.

0
sats 30 Апр 2020 в 11:26