2012-12-03 20 views
5

Mi chiedevo quale sia un buon modo per animare tutte le celle in un UICollectionView. Sto cercando di simulare la modifica in un UICollectionView. Quindi quello che voglio fare è ridurre tutti i limiti di UICollectionViewCells. Quindi quello che ho è questa:Animazione di tutte le UICollectionViewCells in un UICollectionView

- (IBAction)startEditingMode:(id)sender { 
    [_items enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; 
     UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath]; 

     [UIView animateWithDuration:0.25 animations:^{ 
      cell.layer.transform = CATransform3DMakeScale(0.9, 0.9, 1); 
     }]; 
    }]; 
} 

Funziona, ma non ero sicuro se ci fosse una proprietà su UICollectionView, o un modo migliore e più standard per fare qualcosa di simile. Grazie.

risposta

0

Hai provato a utilizzare UICollectionView performBatchUpdates:?

Qualcosa di simile:

[collectionView performBatchUpdates:^{ 
    [_items enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; 
     UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath]; 
     cell.layer.transform = CATransform3DMakeScale(0.9, 0.9, 1); 
    }]; 
} completion:^{}]; 
1

vorrei creare una sottoclasse UICollectionViewLayout. Aggiungi una proprietà BOOL chiamata modifica. Quando modifichi le modifiche, chiama invalidateLayout. Quindi, nell'attributo restituito da -layoutAttributesForItemAtIndexPath: metodo è possibile specificare una trasformazione.

Il problema con il tuo approccio è che interessa solo le celle visibili. La sottoclasse UICollectionViewLayout è utile perché applicherà la trasformazione a tutte le celle anche se ne vengono aggiunte di nuove. E sposta tutta la gestione del layout della vista raccolta dal controller della vista.

Gli attributi delle celle possono includere frame, dimensioni, centro, trasformazione (3D), alfa e attributi personalizzati.

È possibile modificare il valore della modifica in un messaggio di tipo -performBatchUp: blocco, come suggerito da wL_.

- (IBAction)startEditingMode:(id)sender { 
    [self.collectionView performBatchUpdates:^{ 
     ((MyCollectionViewLayout *)self.collectionView.collectionViewLayout).editing = YES; 
    } 
    completion:NULL]; 
} 

E nella sottoclasse UICollectionViewLayout:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 

    if (self.editing) { 
     attributes.transform = CGAffineTransformMakeScale(0.9, 0.9); 
    } 
    else { 
     attributes.transform = CGAffineTransformIdentity; 
    } 

    return attributes; 
} 

Si noti inoltre che (probabilmente) non è necessario un 3D trasforma qui. Una trasformazione affine è sufficiente.

Problemi correlati