Подтвердить что ты не робот

Пользовательская анимация при переключении с одного UICollectionViewLayout на другой?

В качестве теста я сделал один макет, который отображает ячейки в вертикальной линии, а другой, который отображает их в горизонтальной компоновке. Когда я вызываю [collectionView setCollectionViewLayout:layout animated:YES];, он очень хорошо анимирует между двумя позициями.

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

Я попытался подклассифицировать UICollectionViewLayoutAttributes, чтобы содержать свойство анимации, а затем установить эти анимации в переопределенном методе applyLayoutAttributes: используемого UICollectionViewCell. Это работает... ЗА ИСКЛЮЧЕНИЕМ, похоже, происходит только после завершения перехода макета. Если бы я хотел использовать это, мне нужно было бы, чтобы макет не менял текущие позиции объектов сразу, только после того, как он достигнет этого атрибута, часть кода, и это похоже на большую работу...

Или я мог бы подклассом UICollectionView и переопределить setCollectionViewLayout:animated:, но это также похоже на много состояний, чтобы поддерживать между макетами. Ни один из этих оптиков не кажется правильным, потому что существует такой простой способ оживить добавления/удаления ячеек в макете. Я чувствую, что должно быть что-то подобное для подключения к анимации между макетами.

Кто-нибудь знает лучший способ получить то, что я ищу?

4b9b3361

Ответ 1

#define degreesToRadians(x) (M_PI * (x) / 180.0)

UICollectionView *collectionView = self.viewController.collectionView;
HorizontalCollectionViewLayout *horizontalLayout = [HorizontalCollectionViewLayout new];
NSTimeInterval duration = 2;


[collectionView.visibleCells enumerateObjectsUsingBlock:^(UICollectionViewCell *cell, NSUInteger index, BOOL *stop)
 {
     CABasicAnimation *rotationAnimation;
     rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
     rotationAnimation.toValue = @(degreesToRadians(360));
     rotationAnimation.duration = duration;
     rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

     [cell.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
 }];

[UIView animateWithDuration:duration
                 animations:^
 {
     collectionView.collectionViewLayout = horizontalLayout;
 }];