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