2012-09-22 7 views
6

Mam na myśli rzeczy takie jak insertItemsAtIndexPaths lub moveItemAtIndexPath:toIndexPath:. Próbowałem owijać go w blok animacji, ale to nie zadziałało. Wygląda na to, że animacje utknęły w .25 lub .3 sekundy, ale chciałbym to zwolnić. Poza samodzielnym wdrożeniem ruchu, co nie jest warte problemów, czy ktoś wie, czy jest to możliwe z publicznymi API?Czy istnieje sposób zmiany szybkości animacji dla UICollectionViews?

Odpowiedz

5

Absolutnie! Ale nie możesz tego zrobić poprawnie, używając bloków animacji. Musisz zagłębić się w Core Animation.

Widok kolekcji ułatwia dodanie animacji do obiektu CALayer, który tworzy kopię zapasową każdego UICollectionViewCell. Jeśli jednak zaimplementujesz własny układ (lub podklasę istniejącego), możesz wykonać wszystkie niezbędne modyfikacje tych animacji w metodzie finalizeCollectionViewUpdates.

Z dokumentacji UICollectionViewLayout klasy:

kolekcji widok wywoła tę metodę, jako ostatni etap przed poprzedzającym animować żadnych zmian na swoim miejscu.

Oto przykład, w jaki sposób zastąpić animację domyślnej pozycji z własnych:

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

Spójrz metod związanych z animacją-on CALayer aby zobaczyć, jak można kopać w co animacje są aktualnie uruchomione na twojej warstwie.

Korzystając z tego podejścia, można nawet uzyskać kreatywność i dodać efekty przeregulowania/odbijania przy użyciu CAKeyframeAnimation lub cokolwiek innego, co można wymyślić. Można również wykonywać pewne czynności, takie jak selektywne wyłączanie niektórych animacji (takich jak rozmiar) i utrzymywanie innych (np. Pozycja).

1

Kopiowanie ten nad stąd: https://stackoverflow.com/a/18392148/1751266

można zmieniać dowolną prędkość animacji z CALayer. Więc dla UICollectionView ten wygląda następująco:

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

I można przywrócić pierwotną prędkość:

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

Aby to działało może trzeba importować QuartzCore:

#import <QuartzCore/QuartzCore.h> 

Pamiętaj tylko, że ma wpływ na inne animacje na tej samej warstwie, w tym animowane UIImageViews i takie, które mogą wymagać kompensacji.

Powiązane problemy