Пользовательская анимация при переключении с одного UICollectionViewLayout на другой?
В качестве теста я сделал один макет, который отображает ячейки в вертикальной линии, а другой, который отображает их в горизонтальной компоновке. Когда я вызываю [collectionView setCollectionViewLayout:layout animated:YES];
, он очень хорошо анимирует между двумя позициями.
Теперь, когда я хотел бы сделать это, у всех взглядов есть несколько спинов, перекосов и переворачиваний по экрану (возможно, с использованием CAKeyframeAnimations), прежде чем, наконец, добраться до места назначения, но я не могу найти подходящее место для подключения это в.
Я попытался подклассифицировать UICollectionViewLayoutAttributes
, чтобы содержать свойство анимации, а затем установить эти анимации в переопределенном методе applyLayoutAttributes:
используемого UICollectionViewCell
. Это работает... ЗА ИСКЛЮЧЕНИЕМ, похоже, происходит только после завершения перехода макета. Если бы я хотел использовать это, мне нужно было бы, чтобы макет не менял текущие позиции объектов сразу, только после того, как он достигнет этого атрибута, часть кода, и это похоже на большую работу...
Или я мог бы подклассом UICollectionView
и переопределить setCollectionViewLayout:animated:
, но это также похоже на много состояний, чтобы поддерживать между макетами. Ни один из этих оптиков не кажется правильным, потому что существует такой простой способ оживить добавления/удаления ячеек в макете. Я чувствую, что должно быть что-то подобное для подключения к анимации между макетами.
Кто-нибудь знает лучший способ получить то, что я ищу?
Ответы
Ответ 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;
}];