Я был там.Есть несколько способов сделать это, особенно если ваши строки действительно имеют постоянную высоту, это должно быть легко.Умножьте количество строк на постоянную высоту, вуаля, у вас есть высота вашего tableView.
ОДНАКО, если у вас есть динамическая высота ячейки tableView, которая находится внутри collectionViewCell или tableViewCell (они одинаковы),тогда вам нужен другой подход.
Мой подход к этому - наблюдение за keyPath contentSize
.Этот идеально подходит, я использовал это в своем основном производственном проекте.Вот полный блок кода, который я использую, включая комментарии / документацию;)
/**
Important Notes, as of 12/18/2018, 9:41PM, a eureka moment:
- No need for label height.
- Needs a reference for tableViewHeight.
- After observing the newSize data, update the constraint's offset of the tableViewHeight reference.
- And then let know the controller to not reload the data of the tableView but rather begin and end updates only.
- beginUpdate() and endUpdate() lets the tableView to update the layout without calling the cellForRow, meaning without calling the setupCell method.
*/
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let obj = object as? LLFTableView, obj.tag == 444 {
if obj == self.tableView && keyPath == "contentSize" {
if let newSize = change?[NSKeyValueChangeKey.newKey] as? CGSize {
// Edit heightOfTableViewConstraint's constant to update height of table view
llfPrint("New Size of the tableView: \(newSize) ✅✅✅✅✅")
DispatchQueue.main.async {
self.constraint_TableViewHeight?.update(offset: newSize.height)
self.delegate?.reloadData()
}
}
}
}
}
Итак, что происходит в контроллере или viewModel, который реализует такой метод делегата reloadData
?Он вызывает другой метод делегата, чтобы просто сообщить контроллеру (который содержит super tableView), что мы обновляем высоту ячейки.
self.tableView.beginUpdates()
self.tableView.endUpdates()
Вот и все!:) Надеюсь, это поможет!