UICollectionView с саморазмерными ячейками использует оценочныйItemSize для удаления анимации

я используюUICollectionView с самоконтроля клеток и установилиestimatedItemSize свойство для этого работать.

Однако при выполнении анимации удаления ячейки анимируются в свое положение, если их размерestimatedItemSize свойство, а не их автоматический макет (фактический) размер.

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

Я попытался создать подкласс макета потока представления коллекции и переопределитьinitialLayoutAttributesForAppearingItemAtIndexPath(_:) а такжеfinalLayoutAttributesForDisappearingItemAtIndexPath(_:), но при проверке возвращаемые значения суперкласса для этих методов верны.

Кто-нибудь знает решение этой, казалось бы, базовой ошибки?

 boog22 мая 2018 г., 07:29
эй, я тоже застрял здесь, у нас есть какое-нибудь обновление? или нам просто нужно использовать tableView в этом случае?
 Roland30 нояб. 2017 г., 22:10
Эй @ Алексей, спасибо за помощь! К сожалению, это входит в цикл внутриprepareLayout и я не смог найти проблему. Я не могу на самом деле повторить логику :( Я буду держать проект вокруг, возможно, я в конечном итоге лучше пойму его, и я смогу воспроизвести его.
 Alexey30 нояб. 2017 г., 09:34
@Roland мы закончили с использованием этого решения:github.com/adamwaite/SelfSizingWaterfallCollectionViewLayout это работало без наших изменений. Вы можете попробовать это? Этот макет делает то, что я написал выше, но с поддержкой верхних и нижних колонтитулов. Надеюсь, это поможет
 Roland29 нояб. 2017 г., 18:21
@ Алексей Интересное предложение, но не могли бы вы помочь, пожалуйста? Я попытался последовать вашему совету, но прыжки все еще происходят (все существующие ячейки исчезают перед повторным появлением). ВinvalidationContext(forPreferredLayoutAttributes:withOriginalAttributes) Я спасаюpreferredLayoutAttributes, затем вlayoutAttributesForItem Я возвращаю их, если они существуют, или сохраняю их снова, если ихsize != estimatedSize (значит они были рассчитаны - подумал я).
 Alexey01 дек. 2017 г., 12:31
@Roland, вы должны быть уверены, что то, что вы возвращаете в предпочитаемом элементе LayoutAttributesFitting, совпадает с тем, что вы возвращаете в этом пользовательском макете, так как я знаю, что по умолчанию в нем 2 столбца, попробуйте установить 1
 Peter Schumacher13 сент. 2016 г., 11:39
Я сам сейчас вычисляю размеры. Система UIView systemLayoutSizeFittingSize: очень полезна для этого.
 Adam Carter12 сент. 2016 г., 00:14
К сожалению нет. Мы вернулись к использованию UITableView, который кажется задом наперед, но пока является единственным решением (которое я знаю в любом случае)
 Roland02 дек. 2017 г., 17:14
@ Alexey Спасибо за ваш постоянный ввод, но я не смог заставить его работать :( Пробовал с 1 столбцом, устанавливая размер ячейки или пытаясь воспроизвести его функциональность. Помимо прочего, я также пытался создать подклассflowLayoutпереопределить ееcollectionViewContentSize и вернуть «правильный» размер (тот, что прямо перед удалением / вставкой), но он все равно прыгает / неправильно перезагружает новые элементы. Думаю, я открою ATS, надеюсь, они могут помочь. Предоставлю некоторую информацию, если мне удастся решить эту проблему, но, поскольку есть как минимум 3 сообщения об ошибках, одно знакомство с iOS 8 ... У меня нет особой уверенности :(
 Peter Schumacher07 сент. 2016 г., 10:18
Привет, Адам, я обнаружил, что анимации всегда возвращаются к расчетному размеру, что делает некоторые "интересные" анимации. У меня также проблема в том, что статический расчетный размер недостаточно точен. Вы нашли что-то, чтобы улучшить это.
 Alexey26 мар. 2017 г., 21:50
Была такая же проблема, но после вставки. По какой-то причине UICollectionViewFlowLayout забыл об автоматически выделенных размерах и применил оценочный параметрItemSize для уже видимых ячеек. Это привело к ужасным скачкам анимации. Удалось решить эту проблему с помощью пользовательского UICollectionViewLayout, который запоминает атрибуты и обновляет их размеры в -invalidationContextForPreferredLayoutAttributes: withOriginalAttributes :.

Ответы на вопрос(0)

Ваш ответ на вопрос