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.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage