Ruckeliges Scrollen nach dem Aktualisieren von UITableViewCell mit UITableViewAutomaticDimension
Ich erstelle eine App mit einer Feed-Ansicht für von Benutzern übermittelte Beiträge. Diese Ansicht hat einUITableView
mit einem benutzerdefiniertenUITableViewCell
Implementierung. In dieser Zelle habe ich ein weiteresUITableView
zum Anzeigen von Kommentaren. Das Wesentliche ist ungefähr so:
Feed TableView
PostCell
Comments (TableView)
CommentCell
PostCell
Comments (TableView)
CommentCell
CommentCell
CommentCell
CommentCell
CommentCell
Der erste Feed wird mit 3 Kommentaren zur Vorschau heruntergeladen. Wenn jedoch weitere Kommentare vorhanden sind oder der Benutzer einen Kommentar hinzufügt oder löscht, möchte ich das @ aktualisierePostCell
in der Feed-Tabellenansicht durch Hinzufügen oder Entfernen vonCommentCells
zur Kommentartabelle innerhalb desPostCell
. Ich benutze zur Zeit den folgenden Helfer, um das zu erreichen:
// (PostCell.swift) Handle showing/hiding comments
func animateAddOrDeleteComments(startRow: Int, endRow: Int, operation: CellOperation) {
let table = self.superview?.superview as UITableView
// "table" is outer feed table
// self is the PostCell that is updating it's comments
// self.comments is UITableView for displaying comments inside of the PostCell
table.beginUpdates()
self.comments.beginUpdates()
// This function handles inserting/removing/reloading a range of comments
// so we build out an array of index paths for each row that needs updating
var indexPaths = [NSIndexPath]()
for var index = startRow; index <= endRow; index++ {
indexPaths.append(NSIndexPath(forRow: index, inSection: 0))
}
switch operation {
case .INSERT:
self.comments.insertRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None)
case .DELETE:
self.comments.deleteRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None)
case .RELOAD:
self.comments.reloadRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.None)
}
self.comments.endUpdates()
table.endUpdates()
// trigger a call to updateConstraints so that we can update the height constraint
// of the comments table to fit all of the comments
self.setNeedsUpdateConstraints()
}
override func updateConstraints() {
super.updateConstraints()
self.commentsHeight.constant = self.comments.sizeThatFits(UILayoutFittingCompressedSize).height
}
Dies führt das Update ganz gut aus. Der Beitrag wird mit Kommentaren aktualisiert, die im @ hinzugefügt oder entfernt wurdePostCell
wie erwartet. Ich verwende die automatische GrößenanpassungPostCells
in der Feed-Tabelle. Die Kommentartabelle desPostCell
wird erweitert, um alle Kommentare anzuzeigen, aber die Animation ist etwas ruckelig und die Tabelle scrollt ungefähr ein Dutzend Pixel nach oben und unten, während die Zellaktualisierungsanimation stattfindet.
Das Springen beim Ändern der Größe ist etwas ärgerlich, aber mein Hauptproblem kommt danach. Wenn ich jetzt im Feed nach unten scrolle, ist der Bildlauf wie zuvor reibungslos. Wenn ich jedoch nach dem Hinzufügen von Kommentaren über der Zelle nach oben scrolle, deren Größe ich gerade geändert habe, springt der Feed einige Male zurück, bevor er den oberen Rand des Feeds erreicht. Ich habe arrangiertiOS8
Automatische Größenanpassung von Zellen für den Feed wie folgt:
// (FeedController.swift)
// tableView is the feed table containing PostCells
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 560
Wenn ich das @ entferestimatedRowHeight
, die Tabelle wird immer dann nach oben verschoben, wenn sich die Zellenhöhe ändert. Ich fühle mich jetzt ziemlich festgefahren und könnte als neuer iOS-Entwickler alle Tipps gebrauchen, die du hast.