2013-08-09 3 views
0

У меня есть UICollectionView, который отформатирован как одиночная, прокручиваемая по горизонтали строка по экрану. Он представляет собой следующие записи в очереди, поэтому, когда элементы добавляются и удаляются, это всегда происходит в индексе 0 (в левом углу окна), а затем все это перемещается вперед или назад на одно пространство. Это супер-простой в коде, просто:UICollectionView оживляет многоразовые ячейки?

[_collectionviewNextUp insertItemsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]]; 

и

[_collectionviewNextUp deleteItemsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]]; 

Все работает нормально, за исключением анимации для insertItemsAtIndexPaths: и deleteItemsAtIndexPaths:, в частности, когда элементы CollectionView выходят за край экрана , Пока в очереди осталось всего 6 элементов (число, которое можно увидеть сразу), оно прекрасно анимируется; но 7 предметов и более, и анимация становится странной. Удалите элемент (слева), и он также оживит одно добавленное справа; добавьте элемент (слева), и он также оживит одно удаляемое справа. Даже если длина очереди составляет 50, она всегда анимирует элемент №6 (последний видимый на экране), исчезающий и вновь появляющийся. Нет никаких ошибок или предупреждений или что-то еще, и у меня осталось правильное количество элементов в представлении после завершения анимации, оно просто анимирует добавленную/удаляемую ячейку по краю экрана.

Моя теория заключается в том, что повторно используемые ячейки оживляются. Звучит ли это так? Прокрутка влево и вправо работает отлично, но вставка и удаление кажутся только анимированными в парах, и они всегда «летают» и «вылетают» в одном направлении, как если бы кто-то занимал место другого. Он выглядит (к моему неопытенному глазу), подобно тому, как камера на конце перелетает и добавляется спереди, или тот, что спереди, перемещается в конец.

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

ответ

1

Предполагаю, что вы используете раскладку потока. Планирование потока - очень искаженные элементы анимации по границе layoutAttributesForElementsInRect: (т. Е. Элементы, перемещающиеся и выходящие из вида). По моему опыту вы можете исправить некоторые из этих проблем, переопределив методы «initialLayoutAttributesForAppearingItem» & finalLayoutAttributesForDisappearingItemAtIndexPath: и исправляя фреймы, когда суперкласс возвращает неверные значения. Вот успешный ответ на вопрос very similar issue.

Я открываю источник простой единой сетки VCollectionViewGridLayout, что значительно улучшает анимацию над тем, что предлагает UICollectionViewFlowLayout. Однако в настоящее время он выполняет только вертикальную прокрутку. Но если вы вошли туда и перенести все горизонтальные и вертикальные вычисления, я уверен, что это решит вашу проблему.

+0

Удивительно, спасибо! И быстрый, простой вопрос: что мне нужно для подкласса, чтобы переопределить эти методы? Документация ставит их как часть 'UICollectionViewLayout', но в моем проекте я могу только найти« UICollectionView »,« UICollectionViewCell »и« UICollectionViewFlowLayout ». Являются ли Layout и FlowLayout тем же, или если нет, где я могу найти объект, чтобы я мог указать его на мой новый класс? – Nerrolken

+0

'UICollectionViewLayout' - абстрактный базовый класс. «UICollectionViewFlowLayout» - это единственная конкретная реализация Apple. Если вы не предоставили свой собственный класс макета, вы используете 'UICollectionViewFlowLayout'. Вы можете установить макет в коде, установив свойство коллекции collectionViewLayout' или через инспектор атрибутов в Interface Builder. –

Смежные вопросы