web-dev-qa-db-de.com

Wie erhalte ich die Höhe von UITableView, wenn die Größe der Zellen dynamisch ist?

Ich habe eine UITableView mit Zellen, deren Größe dynamisch ist. Das heißt ich habe eingestellt:

tableView.estimatedRowHeight = 50.0
tableView.rowHeight = UITableViewAutomaticDimension

Jetzt möchte ich die Höhe der gesamten Tabellenansicht erhalten. Ich habe versucht, es durch tableView.contentSize.height zu bekommen, aber es wird nur die geschätzte Zeilenhöhe und nicht die tatsächliche dynamische Höhe der Tabellenansicht zurückgegeben.

Wie erhalte ich die dynamische Höhe der gesamten Tabellenansicht?

15
leonardloo

Ich habe endlich eine Lösung herausgehackt:

tableView.contentSize.height funktioniert nicht für dynamische Zellen, da sie nur die Anzahl der Zellen * estimatedRowHeight zurückgeben.

Um die Höhe der dynamischen Tabellenansicht zu ermitteln, suchen Sie nach allen sichtbaren Zellen und summieren ihre Höhen. Beachten Sie, dass dies nur für Tabellensichten funktioniert, die kürzer als Ihr Bildschirm sind. 

Bevor Sie jedoch nach den oben genannten sichtbaren Zellen suchen, ist es wichtig zu wissen, dass der Hinweis die Tabellenansicht muss auf dem Bildschirm angezeigt werden, damit wir sichtbare Zellen erhalten. Zu diesem Zweck können wir eine Höhenbeschränkung für die Tabellenansicht auf eine beliebig große Zahl festlegen, sodass sie auf dem Bildschirm angezeigt wird:

  1. Höhe der Tabellensichteinschränkung festlegen:

    // 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. Rufen Sie tableView.layoutIfNeeded () auf. Suchen Sie nach den sichtbaren Zellen, summieren Sie ihre Höhe und bearbeiten Sie die Variable 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

es wurde bereits beantwortet, aber ich möchte auch meine Erfahrungen teilen. 

Ich habe das gleiche Problem. Ich habe nach Antworten in vielen ähnlichen Fragen gesucht und deren Antworten ausprobiert und funktioniert nicht. 

Endlich habe ich leonardloo answer gefunden. Vielen Dank, aber es hat mein Problem noch nicht gelöst. Ich möchte nur seine Antwort vervollständigen. Ich habe diesen Code aus seiner Antwort gesetzt: 

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
}

in diesem Codeblock:

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

Nach dem Laden aller Zeilen in der Tabelle wird die Höhe der Zeile mit diesem Code aktualisiert. Es klappt!!!

1
Ebed Kharistian

Auch wenn die Antwort von @ leonardloo teilweise richtig ist und möglicherweise den Bedürfnissen vieler Menschen entspricht, wollte ich mitteilen, wie ich mein Problem behoben habe.

Ich hatte eine große tableView mit großen Zeilen und hatte das gleiche Problem. Als ich die Antwort von @ leonardloo angewendet habe, habe ich gesehen, dass es zeichnet nur die Anzahl der sichtbaren Zellen, die es am Anfang gefunden hat und es zeichnet 1 Zeile, während es 5 zeichnen soll (meine Datenquellenzahl) .

Um das zu beheben, habe ich eine so einfache Lösung gefunden:

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
    // Set tableView's constraint to height + 1 so that 
    // it can still draw the next visible cell it's supposed to.
    self.heightOfTableViewConstraint.constant = heightOfTableView + 1
}

Hier geht es darum, die nächste Zelle zeichnen zu lassen, damit sie auch in visibleCells gezählt wird, indem die Beschränkungskonstante auf height + 1 gesetzt wird. Ich habe es getestet und es scheint jetzt wie ein Zauber zu funktionieren.

0
Yusuf Kamil AK