2012-10-21 17 views
6

Sto visualizzando molte celle di immagini in un UICollectionView. Con un pulsante mi piacerebbe poter raggruppare tutte le mie celle sul primo.UICollectionView: layout personalizzato animazione

Funziona bene ma quando sto provando ad aggiungere una transizione di animazione all'azione di registro, non succede nulla.

Qui il metodo che uso in un layout personalizzato:

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

Qualche idea? Grazie!

risposta

21

Le animazioni non funzioneranno dal metodo da cui le chiamate.

Per modificare il layout e animare a uno nuovo, il metodo più semplice è chiamare performBatchUpdates nella vista raccolta, con nil per ciascun parametro di blocco. Ciò invalida il layout e si anima in quello nuovo per te.

Prima di procedere, è necessario indicare all'oggetto di layout che si desidera che venga eseguito il nuovo layout. Inoltre, all'interno di layoutAttributesForElementsInRect, è sufficiente controllare la variabile booleana e applicare la cornice raggruppata (probabilmente il centro sarebbe meglio) a tutti gli attributi come si fa ora, ma senza animazione. Dovrai anche riprodurre questo codice in layoutAttributesForElementAtIndexPath.

Così, in sintesi:

  1. Rimuovere la chiamata di layout invalidate da dove è
  2. rimuovere le chiamate di animazione da dove sono, basta modificare il layout di attributi
  3. Aggiungere codice ..forElementAtIndexPath come well
  4. Nel controller della vista, chiamare il metodo di raggruppamento sull'oggetto di layout, quindi richiamare PerformBatchupdates nella vista di raccolta.
+0

Grazie! Capisco come funziona ora :) – Pierre

+0

Ecco il risultato per chi vuole vedere :) http://d.pr/v/QUTF (Ho un problema tecnico) – Pierre

+0

È necessario aumentare l'indice z per il "top" "elemento in pila, puoi farlo nello stesso posto in cui regoli il fotogramma. – jrturton

Problemi correlati