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