objective c - sirven - Animación personalizada cuando se cambia de un UICollectionViewLayout a otro?
para que sirven las animaciones (1)
Como prueba hice un diseño que muestra celdas en una línea vertical y otra que las muestra en un diseño horizontal. Cuando llamo a [collectionView setCollectionViewLayout:layout animated:YES];
anima entre las dos posiciones muy limpiamente.
Ahora que me gustaría hacer es tener todos los puntos de vista haciendo algunos giros, warps y vueltas alrededor de la pantalla (probablemente usando CAKeyframeAnimations) antes de llegar finalmente a su destino, pero no puedo encontrar un buen lugar para enganchar esto.
Intenté subclasificar UICollectionViewLayoutAttributes
para que contenga una propiedad de animación, luego establezco esas animaciones en un método applyLayoutAttributes:
reemplazado de UICollectionViewCell
que estoy usando. Esto funciona ... EXCEPTO que parece suceder solo después de que se complete la transición de diseño. Si quisiera usar esto, tendría que tener el diseño que no cambiara las posiciones actuales de los objetos de inmediato, solo después de que llegue a esto aplica atributos parte del código, y eso parece mucho trabajo ...
O podría subclase UICollectionView
y anular setCollectionViewLayout:animated:
pero eso también parece mucho estado para mantener entre diseños. Ninguno de estos optins parece correcto, porque hay una manera tan fácil de animar adiciones / eliminaciones de celdas dentro de un diseño. Siento que debería haber algo similar para conectar las animaciones entre diseños.
¿Alguien sabe la mejor manera de obtener lo que estoy buscando lograr?
#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;
}];