Я создаю приложение, которое имеет представление фида для отправленных пользователем сообщений. Это представление имеет 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 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
автоматические ячейки прорисовки для Feed следующим образом:
// (FeedController.swift)
// tableView is the feed table containing PostCells
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 560
Если я удалю estimatedRowHeight
, таблица просто прокручивается в начало в любое время, когда изменяется высота ячейки. Я чувствую себя довольно застрявшим на этом сейчас и как новый разработчик iOS, мог бы использовать любые советы, которые у вас могут быть.