2013-11-22 6 views
9

Ich habe eine Sammelansicht, und ich gehe für den Effekt, wo, wenn eine Zelle angeklickt wird, wächst es, um den gesamten Bildschirm zu übernehmen. Um dies zu erreichen, rufe ich im Wesentlichen nur performBatchUpdates innerhalb didSelectItemAtIndexPath, und die sizeForItemAtIndexPath weiß, eine größere Größe für eine ausgewählte Zelle zurückzugeben. Das alles funktioniert ganz gut, die Zelle wächst und schrumpft wie gewünscht.Wie animiere ich die Innenansichten einer Sammlungsansichtszelle, während ich ihre Größe ändere?

Das Problem liegt innerhalb der Zelle. Die Sammlungsansichtszelle besteht aus einer moderat komplexen Ansichtshierarchie, die durch Einschränkungen verwaltet wird. Ich möchte, dass die Unteransichten der Zelle mit der animierenden Zelle wachsen und schrumpfen. Leider fangen meine Unteransichten sofort an ihrer neuen Position an, während die Zelle langsam zu ihrer neuen Größe animiert. Wie kann ich sicherstellen, dass der Inhalt der Zelle mit der Zellengröße animiert wird?

Hier sind die beiden relevanten Methoden aus der Sammlung View-Controller:

- (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

Ihre Subviews rasten am ehesten ein, da ein Flag, das die Zelle angibt, die expandiert wird, von false auf true wechselt. Anschließend wird 'layoutSubviews' aufgerufen, wodurch die Unteransichten sofort in ihre erweiterten Positionen verschoben werden. Ich rate nur - wenn Sie Code hinzufügen, können wir sehen, ob das der Fall ist. Eine andere Anmerkung - sollte sich die Zelle über die anderen Zellen in der Sammlung ausdehnen oder sollte sie sie aus dem Weg schieben? Wenn es über die Spitze hinaus erweitert werden soll, empfehle ich, eine neue Ansicht oberhalb der UICollectionView hinzuzufügen und diese zu animieren. – Ian

+0

Ich habe die zwei relevanten Methoden hinzugefügt, die die Größenänderung bei der Auswahl vornehmen. Es gibt sehr wenig anderen Code im View-Controller. Die Zelle selbst ist ein paar Nib-Dateien, nichts, was ich leicht zum Post hinzufügen kann. – Mike

Antwort

11

ich das gleiche Problem genau hatte. Nach vielen Versuchen hat der folgende Code den Trick für mich gemacht. Der Aufruf von layoutIfNeed direkt nach der Stapelaktualisierung mit einer Dauer von 3.0 (+ - die Batchupdate-Dauer) animierte die Einschränkungen.

[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

Danke, dass du mich davor bewahrt hast, hier verrückt zu werden. – logancautrell

+0

ja, das funktioniert, ich habe es das gleiche Problem gelöst – Sherlock

2

Ich möchte Antoine's Antwort erweitern. Durch Aufruf von performBatchUpdates:completion: innerhalb des Animationsblocks wird die Dauer der Zellgrößenänderung festgelegt und die Anpassung der Inhaltsgröße an sie angepasst.

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

Auf diese Weise können Sie auch mit der Animation Timing oder sogar Federanimationen spielen.

Verwandte Themen