2012-09-22 4 views
6

Ich spreche von Dingen wie insertItemsAtIndexPaths oder moveItemAtIndexPath:toIndexPath:. Ich habe versucht, es in einen Animationsblock zu verpacken, aber das hat nicht funktioniert. Es scheint, dass die Animationen bei .25 oder .3 Sekunden hängen bleiben, aber ich möchte das verlangsamen. Abgesehen davon, dass ich die Bewegung selbst implementiere, was den Aufwand nicht wert ist, weiß jemand, ob dies mit öffentlichen APIs möglich ist?Gibt es eine Möglichkeit, die Geschwindigkeit der Animationen für UICollectionViews zu ändern?

Antwort

5

Absolut! Aber Sie können es nicht richtig mit UIView Animation Blöcke machen. Sie müssen sich in Core Animation einarbeiten.

Die Sammlungsansicht fügt dem CALayer, der alle UICollectionViewCell unterstützt, Animationen hinzu. Wenn Sie jedoch ein eigenes Layout (oder eine Unterklasse eines vorhandenen) implementieren, können Sie alle notwendigen Änderungen an diesen Animationen in der finalizeCollectionViewUpdates Methode vornehmen.

Von der UICollectionViewLayout Klasse Dokumentation:

Die Sammlung Ansicht ruft diese Methode als letzten Schritt, bevor Sie Änderungen an ihrem Platz zu animieren vorhergehenden.

Hier ist ein Beispiel dafür, wie die Standardposition Animation mit Ihrer eigenen ersetzen:

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

Schauen Sie sich die Animation bezogenen Methoden auf CALayer zu sehen, wie Sie in welche Animation zur Zeit graben laufen auf deiner Ebene.

Mit diesem Ansatz können Sie sogar kreativ werden und Overshooting/Bounce-Effekte mit CAKeyframeAnimation oder etwas, was Sie sich vorstellen können, hinzufügen. Sie können auch bestimmte Animationen (wie die Größe) selektiv deaktivieren und andere (wie die Position) beibehalten.

1

Vervielfältigung dieser über von hier: https://stackoverflow.com/a/18392148/1751266

Sie können jede beliebige Animationsgeschwindigkeit mit CALayer ändern. Also für UICollectionView sieht dies wie folgt aus:

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

Und Sie können die ursprüngliche Geschwindigkeit ändern zurück:

#import <QuartzCore/QuartzCore.h> 

:

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

Dazu Sie Quartz importieren müssen arbeiten Bedenken Sie jedoch, dass sich dies auf alle anderen Animationen auf derselben Ebene auswirkt, einschließlich animierter UIImageViews und so, dass sie möglicherweise kompensiert werden müssen.

Verwandte Themen