web-dev-qa-db-fra.com

Animer le cadre et le changement de format de UICollectionView

J'essaie de créer un effet dans lequel je modifie la mise en page de mon UICollectionView tout en modifiant la taille du cadre.

Initialement, la disposition collectionView présente un style de galerie "miniature" en plein écran.

Après avoir redimensionné le cadre en une bande mince, j'aimerais présenter une présentation de style "pellicule"

les deux mises en page fonctionnent indépendamment et comme prévu.

J'ai essayé un code similaire à ceci:

[UIView animateWithDuration:1
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         self.collectionview.frame = newFrame; // animate the frame size


                     }
                     completion:^(BOOL finished) {
                        [self.collectionView.collectionViewLayout invalidateLayout];

    [self.collectionView setCollectionViewLayout:filmstriplayout animated:YES];    // now set the new layout
                     }];

Mais il semble très agité et ne redimensionne pas comme prévu.

Existe-t-il un moyen de modifier simultanément la présentation collectionview et la taille du cadre tout en animant le changement?

13
Avner Barr

Je n'ai pas de réponse spécifique, mais quelques suggestions à prendre en compte.

UICollectionView ne gère pas toujours les instances de disposition changeantes. Voici un bon discussion du problème et quelques solutions de contournement .

Mais ce que j’ai réellement fait dans la pratique et qui a fonctionné pour moi a été d’implémenter les deux présentations dans un seul objet de présentation qui sait comment basculer entre les modes de présentation. J'ai constaté que le changement de mode de présentation dans un bloc de mise à jour par lots était moins problématique que d'utiliser setCollectionViewLayout avec deux instances de présentation différentes:

[self.collectionView performBatchUpdates:^{
    MyLayout *layout = (MyLayout *)self.collectionView.collectionViewLayout;
    layout.mode = otherLayoutMode;
} completion:nil];
18
Timothy Moose

Définissez d'abord la taille de l'élément de grille comme gridItemSize = CGSizeMake(98, 98);, puis exécutez l'action de lot de UICollectionView. Les éléments en vue de collection changent de taille avec une animation. :)

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
   return CGSizeMake(gridItemSize.width, gridItemSize.height);
}

[self.collectionview performBatchUpdates:^{
    [self.collectionview.collectionViewLayout invalidateLayout];
    [self.collectionview setCollectionViewLayout:self.collectionview.collectionViewLayout animated:YES];
} completion:^(BOOL finished) {    
}];
13
Zulqarnain

J'animais un changement de taille sur une UICollectionViewLayout personnalisée que j'ai appelée layoutIfNeeded dans un bloc d'animation, car performBatchUpdates ne semblait pas fonctionner. L'ajout de setCollectionViewLayout n'a apparemment pas non plus fait de différence

UIView.animate(withDuration: 0.2, animations: {
  let layout = self.collectionView.collectionViewLayout as! CustomFlowLayout
  self.collectionView.collectionViewLayout.invalidateLayout()

  let size = smallCollection
    ? CGSize(width: 44, height: 44)
    : CGSize(width: 120, height: 120)

  layout.size = size
  self.collectionView.layoutIfNeeded()
})
0
richy