it-roy-ru.com

Как получить высоту UITableView при динамическом размере ячеек?

У меня есть UITableView с ячейками, которые имеют динамический размер. Это означает, что я установил:

tableView.estimatedRowHeight = 50.0
tableView.rowHeight = UITableViewAutomaticDimension

Теперь я хочу получить высоту всего представления таблицы. Я попытался получить его через tableView.contentSize.height, но он возвращает только приблизительную высоту строки, а не фактическую динамическую высоту табличного представления.

Как получить динамическую высоту всего представления таблицы?

15
leonardloo

Я наконец взломал решение:

tableView.contentSize.height не будет работать для динамических ячеек, потому что они будут возвращать только количество ячеек * estimatedRowHeight.

Следовательно, чтобы получить динамическую высоту представления таблицы, вы ищите все видимые ячейки и суммируете их высоту. Обратите внимание, что это работает только для табличных представлений, которые короче вашего экрана. 

Однако, прежде чем мы сделаем вышеупомянутое для поиска видимых ячеек, важно знать, что примечание нам нужно получить табличное представление на экране, чтобы мы могли получить видимые ячейки . Для этого мы можем установить ограничение высоты для табличного представления на произвольно большое число, чтобы оно отображалось на экране:

  1. Установить высоту ограничения просмотра таблицы:

    // Class variable heightOfTableViewConstraint set to 1000
    heightOfTableViewConstraint = NSLayoutConstraint(item: self.tableView, attribute: .height, relatedBy: .equal, toItem: containerView, attribute: .height, multiplier: 0.0, constant: 1000)
    containerView.addConstraint(heightOfTableViewConstraint)
    
  2. Вызовите tableView.layoutIfNeeded () и по завершении найдите видимые ячейки, суммируйте их высоту и отредактируйте heightOfTableViewConstraint:

    UIView.animate(withDuration: 0, animations: {
        self.tableView.layoutIfNeeded()
        }) { (complete) in
            var heightOfTableView: CGFloat = 0.0
            // Get visible cells and sum up their heights
            let cells = self.tableView.visibleCells
            for cell in cells {
                heightOfTableView += cell.frame.height
            }
            // Edit heightOfTableViewConstraint's constant to update height of table view
            self.heightOfTableViewConstraint.constant = heightOfTableView
    }
    
17
leonardloo

на него уже ответили, но я тоже хочу поделиться своим опытом. 

У меня та же проблема. Я искал ответы во многих похожих вопросах, пробовал их ответы и не работал. 

Наконец я нашел ответ leonardloo . Большое спасибо, но это еще не решило мою проблему. Я просто хочу завершить его ответ. Я положил этот код из его ответа: 

UIView.animate(withDuration: 0, animations: {
self.tableView.layoutIfNeeded()
}) { (complete) in
    var heightOfTableView: CGFloat = 0.0
    // Get visible cells and sum up their heights
    let cells = self.tableView.visibleCells
    for cell in cells {
        heightOfTableView += cell.frame.height
    }
    // Edit heightOfTableViewConstraint's constant to update height of table view
    self.heightOfTableViewConstraint.constant = heightOfTableView
}

в этом блоке кода:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    if indexPath.row == data.count-1{ 
        // Insert the code here
    }
    return cell
}

Это означает, что после загрузки всех строк в таблице мы обновляем высоту строки, используя этот фрагмент кода. Оно работает!!!

1
Ebed Kharistian