web-dev-qa-db-fra.com

Comment obtenir la hauteur de UITableView lorsque les cellules sont dimensionnées de manière dynamique?

J'ai un UITableView avec des cellules qui sont dimensionnées dynamiquement. Cela signifie que j'ai défini:

tableView.estimatedRowHeight = 50.0
tableView.rowHeight = UITableViewAutomaticDimension

Maintenant, je veux obtenir la hauteur de la vue de la table entière. J'ai essayé de l'obtenir via tableView.contentSize.height, mais cela ne renvoie que la hauteur estimée de la ligne, et non la hauteur dynamique réelle de la vue tableau.

Comment puis-je obtenir la hauteur dynamique de la vue de table entière?

15
leonardloo

J'ai finalement piraté une solution:

tableView.contentSize.height ne fonctionnera pas pour les cellules dynamiques car elles ne renverront que le nombre de cellules * estimatedRowHeight.

Par conséquent, pour obtenir la hauteur de la vue de table dynamique, vous recherchez toutes les cellules visibles et récapitulez leurs hauteurs. Notez que cela ne fonctionne que pour les vues de table plus courtes que votre écran. 

Cependant, avant de procéder à ce qui précède pour rechercher des cellules visibles, il est important de connaître la note nous devons afficher la vue du tableau à l'écran afin d'obtenir des cellules visibles . Pour ce faire, nous pouvons définir une contrainte de hauteur pour la vue table sur un nombre arbitrairement grand simplement pour qu'il apparaisse à l'écran:

  1. Définir la hauteur de la contrainte de vue de table:

    // 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. Appelez tableView.layoutIfNeeded () et, une fois l'opération terminée, recherchez les cellules visibles, récapitulez leur hauteur et modifiez la 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

on y a déjà répondu, mais je veux aussi partager mon expérience. 

J'ai le même problème. J'ai cherché des réponses dans beaucoup de questions similaires et essayé leurs réponses et ne fonctionne pas. 

Enfin, j'ai trouvé Léonardloo répondre . Merci beaucoup, mais ça n'a pas encore résolu mon problème. Je veux juste compléter sa réponse. Je mets ce code de sa réponse: 

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
}

dans ce bloc de code:

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

Cela signifie qu'après que toutes les lignes de la table ont été chargées, nous mettons à jour la hauteur de la ligne en utilisant ce morceau de code. Ça marche!!!

1
Ebed Kharistian