Почему UITableViewCell мигает при изменении высоты?

У меня есть простой UITableView с UITableViewCells. Для 0-й строки в представлении таблицы я установил цвет фона для ячейки. Теперь, нажав 0-ю строку, я просто хочу, чтобы строка расширялась. Чтобы достичь этого, я использую тот же метод, что описал здесь, чтобы изменить высоту 0-й строки.

Теперь проблема заключается в том, что ячейка расширяется и сворачивается, но с каждым процессом в клетке появляется уродливая вспышка/мерцание. Я пробовал как beginupdates/endupdates, так и перезагружать только одну строку, используя [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone];

Что вызывает мерцание/вспышку при нажатии? И как мне избавиться от него? И да, я забыл упомянуть, что я настроил стиль выбора ячейки ни к чему. Так что не вызывать этого.

Ответы

Ответ 1

У меня была такая же проблема при использовании непрозрачного цвета фона ячейки. Решение состоит в использовании свойства backgroundView вместо backgroundColor:

UIView *backgroundView = [[UIView alloc] initWithFrame:cell.frame];
backgroundView.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.1f];
cell.backgroundView = backgroundView;
cell.backgroundColor = [UIColor clearColor];

Ответ 2

У меня была аналогичная проблема с несколькими виновниками:

  • Убедитесь, что все вызовы tableview находятся в основном потоке.
  • Проверьте логику высоты вашей ячейки, если есть несоответствия, это может вызвать подобные проблемы. Помните, что высоты ячеек необходимо обновить до конечной высоты, прежде чем вы попросите таблицу перезагрузить строки.
  • Используйте цвет фона сплошной ячейки. iOS 7, похоже, имеет проблемы, если цвет фона ячейки не является полностью непрозрачным. (Я не мог найти решение этого вопроса при использовании непрозрачного цвета bg. Я подозреваю, что это может быть ошибка iOS 7.)

Ответ 3

Я думаю, что вы не должны использовать методы beginUpdate/endUpdates и выполнять анимацию вручную перед вызовом reloadData. Конечное состояние ячеек (после анимации) определяется с помощью источника данных. Надеюсь, это поможет вам.

Ответ 4

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

     [UIView setAnimationsEnabled:NO];
     [self.tableView beginUpdates];

     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]
                                               withRowAnimation:UITableViewRowAnimationNone];
     [self.tableView endUpdates];
     [UIView setAnimationsEnabled:YES];

Вышеприведенный фрагмент не будет иметь анимации на ячейках при перезагрузке ячейки

Ответ 5

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

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]];

Если это все еще не выглядит хорошо, попробуйте оживить все видимые строки:

[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationFade]];