Плохая прокрутка после обновления 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, мог бы использовать любые ваши советы.