2013-07-13 5 views
9

Ich bin gespannt, wenn die Inhalt Größe UITableView nach dem Einfügen/Löschen Animation Aufruf aktualisiert wird. Ich dachte, es wäre wie bei den meisten [UIView Animation ...] Blöcken, da die Rahmengröße/Inhaltsgröße sofort aktualisiert würde, obwohl die Animation nicht abgeschlossen wurde, aber es scheint nicht so zu sein. Irgendwelche Ideen?Wann wird UITableView Inhalt Größe mit Zeile einfügen/löschen Animation

+1

Haben Sie das gelöst? Ich stoße auf das gleiche Problem. Einfügen/Löschen von Zeilen, dann erwartet tableView.contentSize zu aktualisieren, aber das scheint asynchron zu sein. – VaporwareWolf

Antwort

0

wird die Inhalt Größe nach dem Aufruf von Delegierten über Höhe geändert:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; 
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; 
+2

Danke für die Antwort. Kann ich irgendwie benachrichtigt werden oder irgendeine Art von Delegiertenmethode, die mir sagt, dass sich die Inhaltsgröße geändert hat? Es scheint passieren, nachdem die Animation abgeschlossen ist, aber ich hoffe, die neue Größe des Inhalts vor, so dass ich Dinge um die Tabelle entsprechend animieren kann – SLEW

+0

Ich habe dies ausprobiert und Log-Anweisungen vor und nach dem ich die tableview aufgerufen: heightForRowAtIndexPath: Methode und Die Inhaltsgröße wurde nicht aktualisiert. Dies hat mir jedoch geholfen, eine Lösung für die Berechnung der Inhaltsgröße zu finden. Ich werde die Lösung als separate Antwort veröffentlichen. – Daren

2

Leider habe ich nicht in der Lage gewesen, eine gute Möglichkeit zu finden, den Content zu aktualisieren, wenn das Hinzufügen/entweder Zeilen aus einer UITableView zu löschen, aber Ich habe einen Weg gefunden, um zu berechnen, was es sein wird, wenn Sie die Indexpfade der Zellen kennen, die Sie hinzufügen/entfernen.

Mithilfe des Indexpfads der geänderten Zeilen können Sie die Höhen der entsprechenden Zellen mit der Methode tableView: heightForRowAtIndexPath: berechnen und zur aktuellen Höhe der Inhaltsgröße der Tabellenansicht hinzufügen. Hier ist ein Beispiel, wenn Sie nur das Hinzufügen einer Zeile:

[self.tableView insertRowsAtIndexPaths:@[indexPathOfNewRow] withRowAnimation:UITableViewRowAnimationAutomatic]; 
CGFloat newCellHeight = [self tableView:self.tableView heightForRowAtIndexPath:indexPathOfNewRow]; 
CGFloat newContentSizeHeight = self.tableView.contentSize.height + newCellHeight 
1

Es ist wie sizeThatFits() sieht die Höhe eines neuen contentSize aussetzen können, die anhängig ist. Sie können diese ausstehende Größe zuweisen, um sie für Bildlaufanimationen frühzeitig auflösen zu lassen.

Mit etwas wie folgt aus:

extension UIScrollView { 

    var pendingContentSize: CGSize { 
     var tallSize = contentSize 
     tallSize.height = .greatestFiniteMagnitude 
     return sizeThatFits(tallSize) 
    } 

    func scrollToBottom(animated: Bool) { 
     contentSize = pendingContentSize 
     let contentRect = CGRect(origin: .zero, size: contentSize) 
     let (bottomSlice, _) = contentRect.divided(atDistance: 1, from: .maxYEdge) 
     guard !bottomSlice.isEmpty else { return } 
     scrollRectToVisible(bottomSlice, animated: animated) 
    } 

} 

Ich bin in der Lage View-Controller-Code wie folgt zu schreiben:

tableView.insertRows(at: [newIndexPath], with: .none) 
tableView.scrollToBottom(animated: true) 

und haben die Tabelle bewegen den ganzen Weg nach unten (mit dem neuen Inhaltsgröße), anstatt in die vorletzte Zeile zu scrollen (mit der alten Inhaltsgröße).

Verwandte Themen