Динамическая высота UITableView внутри UIcollectionViewCell - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть UICollectionViewCell, внутри которого есть UTableView.Я хочу рассчитать высоту UITableView динамически на основе содержимого внутри него.Это означает, что UITableView не должен прокручиваться, а должен увеличивать / уменьшать свою высоту в соответствии с его содержимым.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Я был там.Есть несколько способов сделать это, особенно если ваши строки действительно имеют постоянную высоту, это должно быть легко.Умножьте количество строк на постоянную высоту, вуаля, у вас есть высота вашего 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()

Вот и все!:) Надеюсь, это поможет!

0 голосов
/ 29 декабря 2018

Вы можете использовать представление таблицы с самоопределением, как это:

class SelfSizingTableView: UITableView {

    override var intrinsicContentSize: CGSize {
        return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
    }

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

}

Кроме того, вы должны убедиться, что правильно установили ограничения в ячейке представления коллекции (полный набор ограничений сверхуячейка представления коллекции внизу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...