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
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.
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.