2012-09-22 20 views
6

Estoy hablando de cosas como insertItemsAtIndexPaths o moveItemAtIndexPath:toIndexPath:. He tratado de envolverlo en un bloque de animación, pero eso no funcionó. Parece que las animaciones están estancadas a .25 o .3 segundos, pero me gustaría desacelerar esto. Además de implementar el movimiento yo mismo, que no vale la pena, ¿alguien sabe si esto es posible con las API públicas?¿Hay alguna forma de cambiar la velocidad de las animaciones para UICollectionViews?

Respuesta

5

¡Absolutamente! Pero no puede hacerlo correctamente usando los bloques de animación UIView. Necesitas profundizar en Core Animation.

La vista de colección agrega útilmente animaciones al CALayer que está respaldando cada UICollectionViewCell. Pero si implementa su propio diseño (o subclase de un existente) puede hacer todas las modificaciones necesarias en estas animaciones en el método finalizeCollectionViewUpdates.

De la documentación UICollectionViewLayout clase:

Los linterna Vista llama a este método como el último paso antes de proceder a animar cualquier cambio en su sitio.

Aquí es un ejemplo de cómo sustituir la animación posición por defecto con su propio:

- (void)finalizeCollectionViewUpdates 
{ 
    for (UICollectionViewCell *cell in [self.collectionView visibleCells]) 
    { 
     CAAnimation *positionAnimation = [cell.layer animationForKey:@"position"]; 
     if (positionAnimation) 
     { 
      [cell.layer removeAnimationForKey:@"position"]; 

      CALayer *presentationLayer = cell.layer.presentationLayer; 
      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
      [animation setFromValue:[NSValue valueWithCGPoint:presentationLayer.position]]; 
      [animation setToValue:[NSValue valueWithCGPoint:cell.layer.position]]; 
      [animation setDuration:0.4]; 

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

vistazo a los métodos relacionados con la animación que aparecen en la CALayer para ver cómo se puede excavar en lo animaciones están ejecutando actualmente en tu capa.

Utilizando este enfoque, puede incluso ser creativo y agregar efectos de rebasamiento/rebote usando CAKeyframeAnimation o cualquier otra cosa que se le ocurra. También podría hacer cosas como deshabilitar selectivamente algunas animaciones (como el tamaño) y mantener otras (como la posición).

1

copia de este pasar de aquí: https://stackoverflow.com/a/18392148/1751266

Usted puede cambiar cualquier velocidad de la animación con CALayer. Así que para UICollectionView esto se parece a lo siguiente:

[self.collectionView.viewForBaselineLayout.layer setSpeed:0.1f]; 

Y se puede cambiar de nuevo la velocidad original:

[self.collectionView.viewForBaselineLayout.layer setSpeed:1.0f]; 

Para que esto funcione es posible que tenga que importar QuartzCore:

#import <QuartzCore/QuartzCore.h> 

Solo tenga en cuenta que afecta a otras animaciones en la misma capa, incluidas UIImageViews animadas y similares, por lo que pueden necesitar una compensación.

Cuestiones relacionadas