2012-10-21 32 views
6

Wyświetlam wiele komórek obrazu w UICollectionView. Za pomocą jednego przycisku chciałbym móc pogrupować wszystkie moje komórki nad pierwszym.UICollectionView: niestandardowy układ animacji

Działa to dobrze, ale gdy próbuję dodać przejście do animacji w celu przegrupowania, nic się nie dzieje.

Oto metoda używam w niestandardowy układ:

- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSArray* allAttributesInRect = [super layoutAttributesForElementsInRect:rect]; 

    if([allAttributesInRect count] > 0 && _isRegroup) 
    { 
     UICollectionViewLayoutAttributes *firstAttribute = [allAttributesInRect objectAtIndex:0]; 
     CGRect frame = firstAttribute.frame; 

     for(UICollectionViewLayoutAttributes *attribute in allAttributesInRect) 
      [UIView animateWithDuration:0.3f animations:^{attribute.frame = frame;}]; 
    } 
    return allAttributesInRect; 
} 

- (void)regroupCells:(BOOL)isRegroup // This method is called from my collection controller when my button is pressed 
{ 
    _isRegroup = isRegroup; 
    [self invalidateLayout]; 
} 

jakiś pomysł? Dzięki!

Odpowiedz

21

Animacje nie będą działać z poziomu metody, z której dzwonisz.

Aby zmienić układ i animować na nowy, najprostszą metodą jest wywołanie performBatchUpdates w widoku kolekcji z nil dla każdego parametru bloku. Powoduje to unieważnienie układu i animację nowego dla ciebie.

Zanim to zrobisz, powiesz obiektowi layoutu, że chcesz, aby pojawił się nowy układ. Ponadto, wewnątrz layoutAttributesForElementsInRect, po prostu sprawdź swoją zmienną Boolean i zastosuj zgrupowaną ramkę (prawdopodobnie środek będzie lepszy) do wszystkich atrybutów, jak teraz, ale bez animacji. Będziesz także potrzebował odtworzyć ten kod w layoutAttributesForElementAtIndexPath.

Więc w skrócie:

  1. Wyjmij unieważnić połączenia układu, z którego jest
  2. Usuń połączeń animacyjnych, z których są one tylko zmieniają układ atrybutów
  3. Dodaj jako kod ..forElementAtIndexPath dobrze
  4. W kontrolerze widoku wywołaj metodę przegrupowania na obiekcie układu, a następnie wywołaj funkcję performBatchupdates w widoku kolekcji.
+0

Dzięki! Rozumiem, jak to działa teraz :) – Pierre

+0

Oto wynik dla tych, którzy chcą zobaczyć :) http://d.pr/v/QUTF (Mam problem glitch) – Pierre

+0

Musisz zwiększyć indeks z dla "top" "przedmiot w stosie, możesz to zrobić w tym samym miejscu, w którym dopasowujesz ramkę. – jrturton

Powiązane problemy