Анимация изменений кадра подкласса UICollectionViewFlowLayout UICollectionViewLayoutAttributes

У меня есть подкласс UICollectionViewFlowLayout, и в этом подклассе я изменяю кадры UICollectionViewLayoutAttributes, чтобы они казались больше или меньше - в зависимости от их положения на экране.

Я выполняю изменения кадра в layoutAttributesForElementsInRect: А также возвращаю его в layoutAttributesForItemAtIndexPath: Я возвращаю YES в shouldInvalidateLayoutForBoundsChange:

Все работает хорошо, но ячейки не анимируют изменения кадра.

Я что-то упускаю? Почему изменения не анимируются?

Спасибо.


comment
Привет. Не могли бы вы включить код? Что вы имеете в виду, изменяя рамки так, чтобы они были больше или меньше в зависимости от их положения? Позиция прокрутки? (Например, шире в центре экрана) У меня есть пример, где это прекрасно работает, поэтому я предполагаю, что вы имеете в виду что-то другое. Спасибо!   -  person smallwisdom    schedule 11.04.2014
comment
@smallwisdom, «изменение фреймов» означает изменение атрибутов каждого элемента, чтобы элементы казались больше сверху и меньше по пути к вершине (scrollView).   -  person Raz    schedule 13.04.2014


Ответы (1)


РЕШЕНО.

Не существует «функции анимации» или чего-либо подобного, поскольку изменение рамок элементов представления коллекции внутри вашего собственного пользовательского (потокового) макета просто не может быть анимировано.

Решение проблемы заключается в написании алгоритма, который вычисляет все соответствующие кадры, предоставляемые методом layoutAttributesForElementsInRect:, так что установка кадра элемента будет с уважением устанавливать кадр другого элемента и компенсировать добавленный размер или уменьшенный размер.

person Raz    schedule 13.04.2014
comment
Безусловно, если вы хотите анимированное изменение фрейма или любого другого атрибута, вам нужно воссоздать формулу изменения этого атрибута с течением времени, как это делает Apple внутри компании. Затем в этой формуле вы должны применить это дельта-значение И вызвать invalidateLayout(), чтобы оно было отрисовано немедленно. Теперь я не уверен, что это действительно правильный путь, но, честно говоря, я не нашел лучшего способа для действительно пользовательского поведения пользовательского элемента UICollectionLayout. - person Ian; 25.06.2019