2013-02-14 12 views
37

Als Test habe ich ein Layout erstellt, das Zellen in einer vertikalen Linie anzeigt und ein anderes, das sie in einem horizontalen Layout anzeigt. Wenn ich [collectionView setCollectionViewLayout:layout animated:YES]; rufe, animiert es zwischen den zwei Positionen sehr sauber.Benutzerdefinierte Animation beim Wechsel von einem UICollectionViewLayout zu einem anderen?

Nun, da ich wie würde zu tun haben alle Ansichten ein paar Spins tun, Warps und Flips auf dem Bildschirm, bevor sie schließlich Ankunft am Zielort (wahrscheinlich CAKeyframeAnimations verwenden), aber ich kann nicht gut finden legen Sie diesen Haken in.

ich versuchte Subklassen UICollectionViewLayoutAttributes eine Animation Eigenschaft enthalten, dann die Animationen in einer außer Kraft gesetzt applyLayoutAttributes: Methode der UICollectionViewCell Einstellung ich verwende. Das funktioniert ... AUSSER scheint es nur nach der Layout-Übergang ist abgeschlossen. Wenn ich das verwenden möchte, müsste das Layout die aktuellen Positionen der Objekte nicht sofort ändern, erst nachdem es den Attribut-Teil des Codes erreicht hat, scheint das eine Menge Arbeit zu sein ...

Oder ich könnte Unterklasse UICollectionView und überschreiben setCollectionViewLayout:animated:, aber das scheint auch wie eine Menge von Zustand zwischen Layouts zu bleiben. Keines dieser optins scheint richtig, denn es gibt wie eine einfache Möglichkeit, Hinzufügen/Löschen von Zellen innerhalb ein Layout zu animieren. Ich habe das Gefühl, dass es etwas Ähnliches geben sollte, um in die Animationen zwischen Layouts einzuhaken.

Kennt jemand den besten Weg, um zu bekommen, was ich erreichen möchte?

+0

Können Sie Ihren Code anzeigen? – zakhej

Antwort

8
#define degreesToRadians(x) (M_PI * (x)/180.0) 

UICollectionView *collectionView = self.viewController.collectionView; 
HorizontalCollectionViewLayout *horizontalLayout = [HorizontalCollectionViewLayout new]; 
NSTimeInterval duration = 2; 


[collectionView.visibleCells enumerateObjectsUsingBlock:^(UICollectionViewCell *cell, NSUInteger index, BOOL *stop) 
{ 
    CABasicAnimation *rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; 
    rotationAnimation.toValue = @(degreesToRadians(360)); 
    rotationAnimation.duration = duration; 
    rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 

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

[UIView animateWithDuration:duration 
       animations:^ 
{ 
    collectionView.collectionViewLayout = horizontalLayout; 
}]; 
+0

Wo fügst du diesen Code bitte hinzu? – vitaminwater

+0

Dvorak, wo hast du diesen Code gespeichert? – jj0b

+1

Danke Diese Arbeit für mich ... – vipulkumarmehta

Verwandte Themen