Я створюю додаток, який має подання стрічки повідомлень, надісланих користувачами. Цей вигляд має 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, я міг би скористатися будь-якими порадами, які ви можете мати.