Ответ 1
Это ошибка UICollectionViewFlowLayout
, но есть обходной путь. Проблема в том, что атрибуты, возвращаемые initialLayoutAttributesForAppearingItemAtIndexPath:
, имеют неправильные фреймы. В частности, у них есть кадры конечного, на экране, а не на начальном, выключенном экране. Вам просто нужно переопределить этот метод и вернуть правильные кадры. Основная структура переопределения будет выглядеть примерно так:
- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath
{
UICollectionViewLayoutAttributes *pose = [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath];
if (<test for incorrect frame>) {
CGRect frame = pose.frame;
frame.origin.y = <calculate correct frame>;
pose.frame = frame;
}
return pose;
}
Вы будете отвечать за определение сценариев, в которых необходимо скорректировать фреймы, что может включать сохранение собственного внутреннего состояния. Я не проработал эту логику, но я сделал грубый тест и смог получить плавную анимацию.
Обобщая немного, я считаю, что там UICollectionViewFlowLayout
настолько глючит, и есть так много угловых случаев, с которыми можно бороться, если у вас есть элементы, перемещающиеся и выходящие из экрана, в сочетании с любыми вставками, удалениями или перемещениями, что мне было проще свернуть свои собственные простые макеты. Если вы не собираетесь делать какие-либо вставки, удаления или перемещения, то переопределение UICollectionViewFlowLayout
вполне может быть вашим лучшим выбором.
Сообщите мне, если вам нужна дополнительная помощь.
ИЗМЕНИТЬ
Если вам интересно взглянуть на 3-й партийный макет, я открою исходный макет моей таблицы VCollectionViewGridLayout и добавил пример проекта демонстрируя гладкую расширяющуюся высоту ячейки. Попробуйте запустить Expand project. Существует также "Сортировка и фильтр" с анимированной сортировкой и фильтрацией. Оба проекта позволяют вам переключаться между раскладкой и сеткой, чтобы вы могли видеть улучшение.