Установите высоту UITableView на высоту своего содержимого с помощью Auto Layout
У меня есть представление, в котором есть две метки и вид таблицы внутри него. Я хочу, чтобы метка 1 всегда оставалась выше моего табличного представления и метки 2, чтобы она была ниже таблицы. Проблема заключается в том, что в представлении таблицы необходимо задать размер автоматически, что означает увеличение или уменьшение высоты.
Прямо сейчас у меня есть ограничение, указывающее, что высота табличного представления всегда равна 85 и @IBOutlet
для ограничения высоты, где я могу изменить константу.
Я предполагаю, что мне нужно изменить константу на высоту всех ячеек, но я не уверен, как это сделать.
![Ограничения меню]()
Ответы
Ответ 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()
}