Как сделать анимацию табличного представления плавной при изменении размера ячейки - PullRequest
0 голосов
/ 16 мая 2019

У меня есть представление UITable с пользовательскими ячейками. В некоторых ячейках есть кнопка, чтобы развернуть / свернуть. Иногда изменяемая ячейка, кажется, прыгает в интерфейсе.

Я использую Autolayout и динамический расчет высоты с помощью heightForRowAtIndexPath:. Я просмотрел несколько учебных пособий, в том числе , этот - по ячейкам табличного представления с самоопределением размера , которые я использую для исследования проблемы.

Чтобы воспроизвести проблему, прокрутите середину таблицы и разверните несколько ячеек. Нажмите на ячейку, которая частично показывает. Ячейка будет прыгать, а не оставаться на месте.

Пример:

Видео 1

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

Видео 2

Я попробовал предложение @ DonMag. С маленькими клетками проблема не возникает. Когда я увеличил высоту ячейки до> 60% высоты экрана, произошла анимация прыжка ( видео ).

Я изменил

Question Label.top = topMargin + 8

до

Question Label.top = topMargin + 800


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

[tableView beginUpdates];
[tableView endUpdates];

Но этот фрагмент необходим для представления таблицы для пересчета высоты ячейки.

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

1 Ответ

0 голосов
/ 31 мая 2019

После дальнейшего исследования проблема возникает, когда в таблице есть ячейки с разной высотой (например, 100 против 800). Я не могу использовать одну и ту же приблизительную высоту для каждой ячейки, иначе содержимое, кажется, подпрыгивает при расширении / свертывании ячеек.

Решение состоит из 2 частей, обе из которых необходимы.

Использование реальных размеров ячейки

В heightForRowAtIndexPath: каждая строка использует точный расчет вместо оценки.

Несколько бассейнов повторного использования

Я назначил уникальный идентификатор каждому типу ячейки. Каждый тип ячейки имеет одинаковую высоту. Например, тип A имеет высоту = 120, тип B имеет высоту = 400.

Затем я зарегистрировал разные «пулы» ячеек для каждого типа. Хотя CustomCell является одним и тем же классом для разных типов ячеек, каждый тип ячейки имеет свои ограничения и размеры. Это позволяет исключить ячейку с правильным расчетным размером из пула повторного использования.

tableView.rowHeight = UITableViewAutomaticDimension;
[tableView registerClass:[CustomCell class] forCellReuseIdentifier:typeA];
[tableView registerClass:[CustomCell class] forCellReuseIdentifier:typeB];
...
NSString *cellID = // Could be typeA, typeB, etc.
cell = [tableView dequeueReusableCellWithIdentifier:cellID];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...