Плохая прокрутка после обновления UITableViewCell на месте с помощью UITableViewAutomaticDimension

Я создаю приложение, которое имеет вид канала для пользовательских сообщений. Это мнение имеетUITableView с обычаемUITableViewCell реализация. Внутри этой камеры у меня есть еще одинUITableView для отображения комментариев. Суть что-то вроде этого:

Feed TableView
  PostCell
    Comments (TableView)
      CommentCell
  PostCell
    Comments (TableView)
      CommentCell
      CommentCell
      CommentCell
      CommentCell
      CommentCell

Первоначальный канал будет загружен с 3 комментариями для предварительного просмотра, но если есть еще комментарии, или если пользователь добавляет или удаляет комментарий, я хочу обновитьPostCell на месте внутри представления таблицы подачи путем добавления или удаленияCommentCells к таблице комментариев внутриPostCell, В настоящее время я использую следующий помощник для достижения этой цели:

// (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
}

Это завершает обновление просто отлично. Сообщение обновляется на месте с добавлением или удалением комментариев внутриPostCell как и ожидалось. Я использую авторазмерPostCells в таблице подачи. Таблица комментариевPostCell раскрывается, чтобы показать все комментарии, но анимация немного прерывистая, и таблица как бы прокручивается вверх и вниз на дюжину пикселей или около того, пока происходит анимация обновления ячейки.

Прыжки во время изменения размера немного раздражают, но моя главная проблема возникает позже. Теперь, если я прокручиваю вниз в ленте, прокрутка будет плавной, как и раньше, но если я прокручиваю вверх выше ячейки, которую я только что изменил после добавления комментариев, лента будет прыгать назад несколько раз, прежде чем она достигнет верхней части ленты. Я настраиваюiOS8 автоматическое определение размера ячеек для ленты, как это:

// (FeedController.swift)
// tableView is the feed table containing PostCells
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 560

Если я удалюestimatedRowHeightтаблица просто прокручивается к вершине каждый раз, когда изменяется высота ячейки. Я чувствую себя застрявшим в этом сейчас, и, как новый разработчик iOS, мог бы использовать любые ваши советы.

Ответы на вопрос(6)

Ваш ответ на вопрос