Расширенная анимация UICollectionView с использованием invalidateLayout-вызовов

Руководство по программированию UICollectionView гласит:

В дополнение к анимации операций вставки, удаления и перемещения, вы можете в любое время аннулировать макет и заставить его перерисовать его содержимое. Недействительность макета не анимирует элементы напрямую; когда вы аннулируете макет, представление коллекции отображает элементы в их новых расчетных позициях без анимации. Однако действие недействительности макета заставляет объект макета перемещать элементы явно. В пользовательском макете вы можете использовать это поведение для регулярного размещения ячеек и создания анимированного эффекта.

Я пытался что-то вроде этого, где AnimationStep – это перечисление, используемое моим подклассом UICollectionViewFlowLayout чтобы условно установить позиции плиток с трехступенчатой ​​анимацией:

 -(void)update{ [self animateLayoutAfterDelay:2.0 toStep:AnimationStepOne]; [self animateLayoutAfterDelay:4.0 toStep:AnimationStepTwo]; [self animateLayoutAfterDelay:6.0 toStep:AnimationStepThree]; } -(void)animateLayoutAfterDelay:(NSTimeInterval)delay toStep:(MagazineLayoutAnimationStep)step { double delayInSeconds = delay; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [UIView animateWithDuration:2.0 animations:^{ self.layout.animationStep = step; [self.layout invalidateLayout]; }]; }); } 

Это имеет весьма непредсказуемые последствия. Некоторые клетки ожидают так, как я ожидал, некоторые скрываются и показываются или просто появляются в новых местах. Я помещал случайные цвета фона в ячейки, чтобы убедиться, что это может быть эффект UICollectionView, перерабатывающих ячейки, и, конечно же, это было так. Это объясняет некоторые странности, но не все.

Кто-нибудь знает, как Apple хочет, чтобы я оживлял клетки и перемещал их?

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

Ответ на этот вопрос – использование промежуточных макетов.

 [self.collectionView setCollectionViewLayout: layoutForStepOne animated:YES completion:^(BOOL finished) { [self.collectionView setCollectionViewLayout: layoutForStepTwo animated:YES completion:^(BOOL finished) { [self.collectionView setCollectionViewLayout: layoutForStepThree animated:YES]; }]; }]; 

Это просто:

Создайте новый экземпляр некоторого UICollectionViewLayout и используйте

 - (void)setCollectionViewLayout:(UICollectionViewLayout *)layout animated:(BOOL)animated 

для установки макета на вашем UICollectionView на этот новый объект макета. Убедитесь, что вы используете YES для анимированного параметра.

Изменить: для выполнения многоэтапной анимации я бы попытался

 performBatchUpdates:completion: 

и добавьте следующее обновление в блок завершения и повторите.

  • Тень не отображается в ячейке iOS
  • UICollectionView: как добавить пространство между нижним колонтитулом и заголовком?
  • Изменение атрибутов UICollectionViewCell в файле didSelectItemAtIndexPath
  • Как использовать PHImageManager с UICollectionView
  • Как центрировать первую и последнюю ячейку горизонтального UICollectionView?
  • Проблема с прокруткой UICollectionView
  • UICollectionView: reloadData () вызывают исчезновение ячейки
  • Изменение изображения ячейки UICollectionView, поскольку оно появляется в поле зрения с помощью GCD
  • Верхнее выравнивание UILabel с многострочным
  • Удаление выбранных ячеек в uicollectionview
  • Передача событий касания от горизонтального UICollectionView до вертикального просмотра UITableView
  • Давайте будем гением компьютера.