2016-07-27 11 views
2

Ich habe eine UITableView mit Zellen erstellt, die sich erweitern, wenn Sie darauf tippen. Es ist dem folgenden Projekt nachempfunden: https://github.com/rushisangani/TableViewCellExpandWie funktioniert das Ändern der intrinsicContentSize einer UITableViewCell?

Im Grunde hat die Containeransicht der Zelle zwei Unteransichten, die als Container für die erweiterten/zusammengezogenen Zustände "Front" und "Back" dienen, die jeweils nach oben beschränkt sind. unteren, vorderen und hinteren Kanten der Hauptinhaltsansicht der Zelle. Um die Zelle zu erweitern oder zu kontrahieren, schalte ich einfach die Eigenschaft isActive auf die untere Integritätsbedingung der Vorder- und Rückseite um. Das funktioniert, aber nur wenn ich die Zelle neu lade, wenn sie angezapft wird. Wenn ich nur die Einschränkungen ändere und dann versuche, invalidateIntrinsicContentSize() aufzurufen, passiert nichts.

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    { 
     // Expand/contract the cell and invalidate size (doesn't work) 
//  let cell = tableView.cellForRow(at: indexPath) as! ExpandingCell 
//  cell.tap() 
//  cell.invalidateIntrinsicContentSize() 

     // Keep track of the selected index and configure the expand/contract state when the cell is remade 
     tableView.deselectRow(at: indexPath, animated: false) 
     expandedIndexPath = indexPath 
     if(!expandedIndexPathArray.contains(indexPath)){ 
      expandedIndexPathArray.append(indexPath) 
     } 
     else{ 
      expandedIndexPathArray = expandedIndexPathArray.filter({$0 != indexPath}) 
     } 

     // Whenever a cell's intrinsicContentSize changes, it must be reloaded 
     tableView.reloadRows(at: [indexPath], with: .none) 
    } 

Was passiert hinter den Kulissen? Warum kann die Zelle ihre Größe nicht neu berechnen, ohne erneut geladen zu werden?

Antwort

2

Wenn Sie abschliessen will/Zellen Größe basierend auf ihrem inneren Gehalt zu erweitern, müssen Sie die folgenden drei Schritte tun:

  1. Konfigurieren der Tabellenansicht:

    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 44 
    

    Für statische Tabelle View Controller, müssen Sie heightForRowAtIndexPath implementieren und UITableViewAutomaticDimension zurückgeben.

  2. Update-Zelle Einschränkungen kontrahieren/expandierten Zustand

  3. die Tabellen-Ansicht Änderungen widerzuspiegeln Fragen zu reflektieren:

    tableView.beginUpdates() 
    tableView.endUpdates() 
    
+0

Süß, Ich mag, dass viel besser als die Zelle neu zu laden. Warum funktioniert beginUpdates()/endUpdates(), aber nicht invalidateIntrinsicContentSize()? – GoldenJoe

+0

Die tatsächliche Inhaltsgröße wurde mit Auto Layout in iOS 6 eingeführt. Die Tabellenansichtsklasse ist älter als diese. Es verschiebt auch Änderungen mit eigenen Animationen usw. –

+0

Gibt es irgendeine anständige Dokumentation darüber, wie der Prozess der Größenanpassung einer Zelle mit automatischem Layout funktioniert? Ich weiß, wie man Zellen mit automatischem Layout macht und Dinge zum Laufen bringt, aber es wäre schön, die dahinterliegenden Mechanismen zu verstehen. Apples Dokumentation ist in gewisser Weise ziemlich beschissen. – GoldenJoe

Verwandte Themen