Проблема с анимацией при удалении последней строки UITableView - программирование

Проблема с анимацией при удалении последней строки UITableView

UPDATE: теперь это исправлено в iOS 8.0 и выше. См. Мой принятый ответ для деталей.

У меня есть iOS 7 UITableView, который я разрешаю удалять по строкам в строках. Я обрабатываю удаления в:

tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

С

[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];

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

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

Я бы хотел, чтобы эта последняя ячейка имела ту же анимацию UITableViewRowAnimationTop, что и остальные. Любые идеи о том, что происходит?

4b9b3361

Ответ 1

UPDATE: эта ошибка была исправлена ​​в iOS 8. Это окончательное удаление ячейки теперь сдвигается влево, кнопка удаления скользит вверх и вниз, а фон становится ясным (не более белая область, которая внезапно исчезает после завершения анимации). Исправление iOS 7, приведенное ниже, все еще необходимо при работе ниже iOS 8.

iOS 7 Исправление: Я смог исправить эту проблему, добавив еще один раздел в конец таблицы с достаточно высоким заголовком заголовка раздела. Этот заголовок выглядит так, чтобы он выглядел как пустая область в нижней части таблицы, поэтому вы не можете видеть, что это есть. Когда последняя строка таблицы удаляется, этот заголовок пустой секции скользит вверх и вниз, скрывая кнопку удаления, которая застряла там. Это немного взломанный, но похоже, что это ошибка таблицы.

Ответ 2

В качестве альтернативы трюку keep-the-empty-row, упомянутого Фрэнком Ли, я обошел этот уродливый глюк просто специальным корпусом для удаления последней строки: вместо того, чтобы оживить камеру, просто позвоните -reloadData в представлении таблицы.

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

Ответ 3

Я думаю, что путь - всегда поддерживать пустую строку ниже последней строки в представлении таблицы. Это сделает трюк.

Ответ 4

Вы также можете использовать свойство UITableView.tableFooterView:

- (void)viewDidLoad
{
    [super viewDidLoad];

    ... 

    CGRect frame = [self.tableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    UIView *view = [[UIView alloc] initWithFrame:frame];
    view.backgroundColor = self.tableView.backgroundColor;
    self.tableView.tableFooterView = view;
}

Этот код переходит в контроллер вида с UITableView.

  • Код предполагает ARC.
  • Это другая история, если вы используете фоновое изображение для таблицы.
  • Код может быть окружен "if (iOS > 7)".

Ответ 5

Мое решение состояло в том, чтобы просто отключить сломанную анимацию, спрятав удаляемую ячейку.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.hidden = YES;
}