2016-05-07 6 views
0

Я пытаюсь реализовать tableView, где строки добавляются дополнительные строки с анимацией, в то время как строки видны. Я обновляю массив для источника данных и вызвать:InsertRow Animation scrolls UITableView up

[self.tableView insertRowsAtIndexPaths:addedIndexPaths withRowAnimation:(UITableViewRowAnimationMiddle)]; 

Я хочу TableView, чтобы не прокручивать все и строки для вставки на экране (не над видны). В некотором разделе, особенно в последнем разделе таблицы, ячейки вставлены, свиток таблицы просматривается в совершенно другой раздел.

Я пробовал различные анимации строк, вызывая layoutIfNeeded внутри и beginUpdate/endUpdate, устанавливая правильное смещение содержимого внутри блока beginUpdate/endUpdate или перезагружая весь раздел.

Ничего не работает. Прокрутка просматривается всегда.

Клетки меняют сами по себе, используя ограничения автоопределения. В верхней половине таблицы мы добавили ячейки, как я ожидал.

Как я могу исправить содержимое Смещение, когда ячейки вставлены с анимацией? Как отлаживать эту анимацию?

+0

Вы пробовали другие параметры UITableViewRowAnimation. Пожалуйста, укажите соответствующий код. – KrishnaCA

+0

Да, я пробовал все другие анимации строк. Это не имело никакого значения. Из того, что я знаю, это весь необходимый код (если была обновлена ​​модель данных), чтобы ударить анимированную вставку. И в большинстве случаев он работает нормально, но не всегда. – paul

ответ

0

Это ошибка, связанная с UITableViews, она была там довольно долго и не была исправлена ​​(по внешнему виду, она никогда не будет).

Корень из-за того, что ваши ячейки имеют динамические размеры и (я предполагаю), что вы используете значение UITableViewAutomaticDimension по умолчанию. Чтобы исправить это, вам нужно отказаться от использования «UITableViewAutomaticDimension» и рассчитать размер каждой ячейки. Это должно помочь с размахом табличного вида, но, вероятно, не будет идеальным.

Другим способом является использование CATransaction для блокировки и сохранения позиции в виде таблицы после вставки.

Это должно выглядеть примерно так (возможно, я не проверял):

CGFloat offset = self.tableView.contentSize.height - self.tableView.contentOffset.y; 

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 

[CATransaction setCompletionBlock: ^{ 
    // Code to be executed upon completion 
}]; 

[self.tableView beginUpdates]; 
[self.tableView insertRowsAtIndexPaths: indexPaths 
       withRowAnimation: UITableViewRowAnimationAutomatic]; 

self.tableView.contentOffset = CGPointMake(0, 
             self.tableView.contentSize.height - bottomOffset); 
[self.tableView endUpdates]; 
[CATransaction commit]; 
+0

Как вы вычисляете bottomOfset? – paul

+0

Вы имели в виду смещение, когда вы установили contentOffset в блок анимации? Я тестировал код, и он не работал: табличное представление все еще перескакивает, и изменения не анимируются. Также мигает табличное представление (я думаю, оно перезагружается), когда вы прокручиваете анимацию.У вас есть идеи, как сделать эту работу? – paul

+0

Я был уверен, что он не работает так, как есть. Наверное, нужно немного возиться, чтобы найти лучшую комбинацию, чтобы сделать ее гладкой. НО, это ленивый выход. Просто вычислил высоту ячейки вместо использования UITableViewAutomaticDimension – MikePT28

0

я столкнулся такая же проблема и после попытки много нашел решение, что если я удалю высоту заголовка раздела, как UITableViewAutomaticDimension затем добавление и удаление строк из UITableView отлично работает, и вид таблицы также фиксируется в том же положении.

tableView.sectionHeaderHeight = 10; 
tableView.estimatedSectionHeaderHeight = UITableViewAutomaticDimension; 

удалите более двух строк, если они добавлены.

tableView.estimatedRowHeight = 15; 
tableView.rowHeight = UITableViewAutomaticDimension;* 

Строка с автоматическим измерением не создает никаких проблем.

Но заголовок заголовка секции с автоматическим измерением создаст проблему.

Спасибо.