Почему 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]];