Animación personalizada en UICollectionView recarga datos

Me gustaría animar la recarga de una vista de colección, de modo que cuando se selecciona una celda obtengo una animation similar a las cartas de juego en un juego de solitario. (Imágenes de la antigua tarjeta del solitario MS tratada)

He buscado por "la animation de recarga UICollectionView personalizada" y he visto soluciones como

[self.collectionView performBatchUpdates:^{ [self.collectionView reloadItemsAtIndexPaths:myindexPaths] } completion:nil]; 

y he conjurado esto

  CATransition *transition = [CATransition animation]; transition.duration = 1; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionMoveIn; [self.collectionView.layer addAnimation:transition forKey:nil]; [self.collectionView reloadData]; return; 

Pero no está obteniendo el efecto deseado. ¿Alguna idea de cómo se puede hacer?

Puedes hacer un truco como lo sugerido aquí.

 + (CATransition *)swipeTransitionToLeftSide:(BOOL)leftSide { CATransition* transition = [CATransition animation]; transition.startProgress = 0; transition.endProgress = 1.0; transition.type = kCATransitionPush; transition.subtype = leftSide ? kCATransitionFromRight : kCATransitionFromLeft; transition.duration = AnimationDuration; return transition; } 

y agréguelo a su collectionView

 UISwipeGestureRecognizer *swipeGestureL = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipeToLeftCollectionView:)]; swipeGestureL.direction = UISwipeGestureRecognizerDirectionLeft; [self.collectionView addGestureRecognizer:swipeGestureL]; - (void)didSwipeToLeftCollectionView:(UISwipeGestureRecognizer *)swipeGesture { [self.collectionView.layer addAnimation:[Animation swipeTransitionToLeftSide:YES] forKey:nil]; [self.collectionView reloadData]; } 

resultado:

introduzca la descripción de la imagen aquí

UICollectionViewLayout crear una UICollectionViewLayout personalizada que UICollectionViewLayout su animation personalizada. Si el efecto es solo una traducción del punto A al punto B, puede usar salirse con un uso bastante estándar de las animaciones incorporadas. Establecerá la location de la celda en el punto A en initialLayoutAttributesForAppearingItemAtIndexPath: y en el punto B en layoutAttributesForItemAtIndexPath: Cuando desee repartir las tarjetas, simplemente insertá las routes de índice correspondientes en la vista de colección con performBatchUpdates: Una animation similar para enviar las cartas al distribuidor debe usar finalLayoutAttributesForDisappearingItemAtIndexPath:

Si quieres hacer una animation más compleja, tendrás mucho más trabajo en tus manos. Lo más probable es que incluya instantáneas de una celda y la transforme antes de animar a lo largo de un CGPath . Una vez que se realiza la animation, le dirá a la vista de la colección que la dibuje en su location final.

Me gusta la respuesta de @gbk así que aquí está en Swift 3.1 tanto para izquierda como para derecha

 override func viewDidLoad() { super.viewDidLoad() let swipeGestureL = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) swipeGestureL.direction = .left collectionView.addGestureRecognizer(swipeGestureL) let swipeGestureR = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) swipeGestureR.direction = .right collectionView.addGestureRecognizer(swipeGestureR) } func swipeTransitionToLeftSide(_ leftSide: Bool) -> CATransition { let transition = CATransition() transition.startProgress = 0.0 transition.endProgress = 1.0 transition.type = kCATransitionPush transition.subtype = leftSide ? kCATransitionFromRight : kCATransitionFromLeft transition.duration = 0.3 return transition } @IBAction func swipeLeft() { collectionView.layer.add(swipeTransitionToLeftSide(true), forKey: nil) updateDasource() } @IBAction func swipeRight() { collectionView.layer.add(swipeTransitionToLeftSide(false), forKey: nil) updateDatasource() } func updateDatasource() { self.collectionView.reloadData() }