2012-09-22 6 views
6

Sto parlando di cose come insertItemsAtIndexPaths o moveItemAtIndexPath:toIndexPath:. Ho provato a confezionarlo in un blocco di animazione, ma non ha funzionato. Sembra che le animazioni siano bloccate a 0,25 o 3 secondi, ma vorrei rallentarlo. Oltre a implementare il movimento da solo, che non vale la pena, qualcuno sa se questo è possibile con le API pubbliche?C'è un modo per modificare la velocità delle animazioni per UICollectionViews?

risposta

5

Assolutamente! Ma non puoi farlo correttamente usando i blocchi di animazione UIView. Devi scavare in Core Animation.

La vista raccolta aggiunge utili animazioni allo CALayer che supporta ogni UICollectionViewCell. Ma se si implementa il proprio layout (o una sottoclasse esistente) è possibile apportare tutte le modifiche necessarie a queste animazioni nel metodo finalizeCollectionViewUpdates.

Dalla documentazione UICollectionViewLayout classe:

I collezione guarda chiamate questo metodo come l'ultimo passo prima che precede di animare qualsiasi modifica in posizione.

Ecco un esempio di come sostituire l'animazione posizione di default con il proprio:

- (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"]; 
     } 
    } 
} 

Guarda i metodi di animazione legati su CALayer per vedere come si può scavare in quello che le animazioni sono attualmente in esecuzione sul tuo livello.

Utilizzando questo approccio si può anche essere creativi e aggiungere effetti di overshoot/bounce usando CAKeyframeAnimation o qualsiasi altra cosa si possa pensare. Puoi anche fare cose come disabilitare selettivamente alcune animazioni (come le dimensioni) e mantenere gli altri (come la posizione).

1

Copia questo più da qui: https://stackoverflow.com/a/18392148/1751266

È possibile modificare qualsiasi velocità di animazione con CALayer. Così per UICollectionView questo appare come il seguente:

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

E si può cambiare di nuovo la velocità originale:

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

Per questo lavoro potrebbe essere necessario importare QuartzCore:

#import <QuartzCore/QuartzCore.h> 

Ricorda che influisce su tutte le altre animazioni sullo stesso livello, incluse le UIImageViews animate e tali che potrebbero aver bisogno di essere compensate.