Подтвердить что ты не робот

Установите высоту UITableView на высоту своего содержимого с помощью Auto Layout

У меня есть представление, в котором есть две метки и вид таблицы внутри него. Я хочу, чтобы метка 1 всегда оставалась выше моего табличного представления и метки 2, чтобы она была ниже таблицы. Проблема заключается в том, что в представлении таблицы необходимо задать размер автоматически, что означает увеличение или уменьшение высоты.

Прямо сейчас у меня есть ограничение, указывающее, что высота табличного представления всегда равна 85 и @IBOutlet для ограничения высоты, где я могу изменить константу.

Я предполагаю, что мне нужно изменить константу на высоту всех ячеек, но я не уверен, как это сделать.

Ограничения меню

4b9b3361

Ответ 1

Вы должны переопределить updateViewConstraints() в вашем UIViewController и установить константу ограничения высоты в tableView.contentSize.height:

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

Затем вы должны убедиться, что у Label2 есть верхнее ограничение, которое greaterThanOrEqual к основанию табличного представления. Также вам нужно изменить приоритет ограничения высоты табличного представления с Required на High чтобы избежать конфликтующих ограничений, когда табличное представление contentHeight больше доступной высоты.

Ответ 2

Есть еще один способ сделать это. Вы можете добавить наблюдателя в переменную contentSize табличного представления и собственный размер при изменении содержимого табличного представления.

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var tableHeightConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.new, context: nil)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    tableView.layer.removeAllAnimations()
    tableHeightConstraint.constant = tableView.contentSize.height
    UIView.animate(withDuration: 0.5) {
        self.updateConstraints()
        self.layoutIfNeeded()
    }

}

Ответ 3

В Swift 4.2 и Xcode 10.1

Здесь у вас есть два варианта динамической установки высоты для UITableView на основе содержимого.

1) Если вы получаете размер контента, используйте этот код в viewDidLayoutSubviews()

DispatchQueue.main.async {
  var frame = self.TblView.frame
  frame.size.height = self.TblView.contentSize.height
   self.TblView.frame = frame
}

2) На основе ограничения высоты представления таблицы обновите высоту представления таблицы. После получения ответа от сервера при перезагрузке табличного представления напишите этот код.

DispatchQueue.main.async {
    self.TblViewHeightConstraint.constant = CGFloat((self.array.count) * 30)//Here 30 is my cell height
     self.TblView.reloadData()
}

Ответ 4

Для автоматической регулировки высоты TableView по размеру содержимого используйте это в классе ViewController

//constraintTableViewHeight: - ограничение высоты табличного вида

override func viewWillLayoutSubviews() {

        super.updateViewConstraints()
        self.constraintTableViewHeight.constant = self.tableView.contentSize.height
    }

а также добавить это

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        self.viewWillLayoutSubviews()
    }

Этот код легко настраивает высоту просмотра таблицы автоматически в зависимости от ее размера.

Ответ 5

Расширение ответа @nova на swift 4

tableViewSizeObservation = tableView.observe(\.contentSize) { [weak self] (tableView, _) in
   tableView.layer.removeAllAnimations()
   self?.tableViewHeightContraint.constant = tableView.contentSize.height
   UIView.animate(withDuration: 0.5) {
         self?.view.updateConstraints()
         self?.view.layoutIfNeeded()
   }
}

deinit {
    tableViewSizeObservation?.invalidate()
}