2013-10-27 2 views
13

ОБНОВЛЕНИЕ: теперь это исправлено в iOS 8.0 и выше. См. Мой принятый ответ для деталей.Проблема с анимацией при удалении последней строки UITableView

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

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

С:

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

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

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

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

+3

Я видел эту ту же проблему. Я уверен, что это просто ошибка с UITableView в iOS 7. – patr1ck

+0

Спасибо за UPDATE. Не могли бы вы добавить свое обновление в качестве ответа? Вы даже можете принять его, если он достаточно отвечает на ваш вопрос. Лучший ответ всегда может быть вставлен, и вы можете даже принять этот ответ. –

ответ

4

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

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

+0

В настоящее время это единственное разумное решение для меня. Единственное предостережение в том, что мы не можем использовать прозрачный фон для ячеек. – Eonil

0

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

1

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

У вас не будет анимации, но вы также не увидите глюк, поэтому ваш вид на столе не будет выглядеть сломанным. Целесообразный компромисс.

0

Вы также можете использовать 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)".
+1

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

0

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

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; 
    cell.hidden = YES; 
} 
Смежные вопросы