2013-11-22 10 views
9

Ho una vista di raccolta, e vado per l'effetto in cui quando viene toccata una cella, cresce fino a occupare l'intero schermo. Per riuscirci, in pratica sto chiamando lo performBatchUpdates all'interno di didSelectItemAtIndexPath e lo sizeForItemAtIndexPath sa di restituire una dimensione maggiore per una cella selezionata. Tutto funziona abbastanza bene, la cellula cresce e si restringe a piacere.Come si anima la vista interna di una cella della vista di raccolta mentre si cambiano le dimensioni?

Il problema è all'interno della cella. La cella della vista dell'insieme è costituita da una gerarchia di vista moderatamente complessa gestita da vincoli. Voglio che le viste secondarie della cella crescano e si riducano con la cella di animazione. Sfortunatamente, le mie sottoview si avvicinano immediatamente alla loro nuova posizione man mano che la cella si anima lentamente alla sua nuova dimensione. Come posso garantire che il contenuto della cella si anima con le dimensioni della cella?

Qui ci sono i due metodi rilevanti dal controller della vista collezione:

- (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
if ([collectionView.indexPathsForSelectedItems containsObject:indexPath]) 
    return CGSizeMake(collectionView.bounds.size.width - 20, collectionView.bounds.size.height - (20 + [self.topLayoutGuide length])); 
else 
    return CGSizeMake(260, 100); 
} 

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { 
    [collectionView performBatchUpdates:nil completion:nil]; 
} 
+1

Le sottoview si bloccano molto probabilmente perché un flag che indica che la cella è stata espansa passa da false a true, quindi viene chiamato 'layoutSubviews', che sposta immediatamente le visualizzazioni secondarie nelle posizioni espanse. Sto solo indovinando, se aggiungerai il codice potremo vedere se è così. In un'altra nota - la cella dovrebbe espandersi sopra le altre celle nella raccolta, o dovrebbe spingerle via? Se dovesse espandersi sopra, consiglio di aggiungere una nuova vista sopra UICollectionView e di animarla. – Ian

+0

Ho aggiunto i due metodi rilevanti che eseguono il ridimensionamento alla selezione. C'è molto poco altro codice nel controller della vista. La cella stessa è un paio di file di pennini, nulla che io possa facilmente aggiungere al post. – Mike

risposta

11

ho avuto esattamente lo stesso problema. Dopo molti tentativi, il codice seguente ha fatto il trucco per me. Chiamando layoutIfNeed direttamente dopo l'aggiornamento del batch con una durata di 3.0 (+ - la durata del batchupdate) i vincoli sono stati animati.

[self performBatchUpdates:nil completion:nil]; 

// IndexPath of cell to be expanded 
UICollectionViewCell *cell = [self cellForItemAtIndexPath:indexPath]; 
[UIView animateWithDuration:0.3 animations:^{ 
    [cell.contentView layoutIfNeeded]; 
}]; 
+0

Grazie per avermi salvato dal diventare pazzo qui. – logancautrell

+0

sì, questo funziona, l'ho usato ha risolto lo stesso problema – Sherlock

2

Vorrei ampliare la risposta di Antoine. Chiamando performBatchUpdates:completion: all'interno del blocco dell'animazione si imposta effettivamente la durata del ridimensionamento della cella e si adatta il ridimensionamento del contenuto ad esso.

[UIView animateWithDuration:0.3 animations:^{ 
    [self performBatchUpdates:^{ 
     // set flags needed for new cell size calculation 
    } completion:nil]; 
    [collectionView layoutIfNeeded]; 
}]; 

In questo modo è anche possibile giocare con i tempi di animazione o persino utilizzare le animazioni a molla.

Problemi correlati