2016-04-03 5 views
3

Иногда, когда в анимационных играх отображаются ячейки таблицы, e, g, -[UIView viewWillAppear:animated] с -[UITableView reloadData], содержимое внутри них выдается из верхнего левого угла (0, 0) в конечные кадры , Эта проблема также возникает и в других анимациях просмотра. Еще в прежние времена эта проблема не существовала. В одном обновлении iOS возникла проблема, но исходные позиции были случайными, обычно вне экрана. В другом обновлении iOS проблема стала детерминированной с начальной позицией (0,0).Предотвращение появления просмотров из левого верхнего угла во время анимации на iOS

Я пробовал [tableView layoutIfNeeded], [tableView.layer displayIfNeeded] после [tableView reloadData] и тех, которые находятся на ячейках в cellForRowAtIndexPath. Что я пропустил?

Я загрузил образец проекта https://github.com/keithyipkw/ios-animation-bug. Чтобы надежно воспроизвести проблему, установите точку останова в viewWillAppear, перед reloadData. Потяните экран, чтобы показать сегодняшний центр. Запуск после сегодняшнего центра полностью заметен.

screenshots

ответ

0

Исправление состоит в том, чтобы использовать ячейки dequeue и init с идентификаторами повторного использования. Он по-прежнему работает, когда ячейка появляется в первый раз. Магия заключается в dequeue и init с тем же ненулевым идентификатором.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
if (!cell) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
} 
0

У меня та же проблема, тоже, это происходит, когда телевизор отображает клетки в первый раз.
Это связано с тем, что ячейки создаются с начальным размером прототипа в раскадровке и затем изменяются по размеру на основе ширины телевизора. Чтобы избежать этого в cellForRowAtIndexPath, я устанавливаю ширину ячейки, чтобы она была размером с телевизор и принудительно обновляла автоматическую компоновку ячейки, чтобы все элементы уже соответствовали этому размеру.
Я до сих пор не нашел реального решения, это скорее трюк, я надеюсь, что кто-то еще даст отзыв по вашему вопросу.