J'utilise un UICollectionView
avec UICollectionViewFlowLayout
.
Je règle la taille de chaque cellule via le
collectionView:layout:sizeForItemAtIndexPath:
Lors du passage du portrait au paysage, je voudrais ajuster la taille de chaque cellule pour qu'elle s'adapte complètement à la taille de CollectionView, sans laisser d'espace de remplissage entre les cellules.
Des questions:
1) Comment changer la taille d'une cellule après un événement de rotation?
2) Et, encore mieux, comment faire la mise en page où les cellules s'adaptent toujours à la taille entière de l'écran?
ios
uicollectionview
uicollectionviewcell
Fmessina
la source
la source
sizeForItemAtIndexPath
avant d'appelerdidRotateFromInterfaceOrientation
. Cependant, pour une vue de collection avec plusieurs cellules à l'écran, l'invalidation de la mise en page avant la rotation provoque un saut de taille méchant et visible avant la rotation de la vue. Dans ce cas, je pense que ma réponse est toujours la mise en œuvre la plus correcte.I would like to adjust the size of each cell to **completely fit the size of the CollectionView**
quelle est exactement la solution proposée dans ma réponse. Si vous pouviez inclure ma solution dans votre réponse et noter quelle approche fonctionne le mieux dans quelles conditions cela me suffirait.Réponses:
1) Vous pouvez conserver et échanger plusieurs objets de mise en page, mais il existe un moyen plus simple. Ajoutez simplement ce qui suit à votre
UICollectionViewController
sous-classe et ajustez les tailles selon vos besoins:L'appel
-performBatchUpdates:completion:
invalidera la mise en page et redimensionnera les cellules avec l'animation (vous pouvez simplement passer nil aux deux paramètres de bloc si vous n'avez aucun ajustement supplémentaire à effectuer).2) Au lieu de coder en dur les tailles des éléments
-collectionView:layout:sizeForItemAtIndexPath
, divisez simplement la hauteur ou la largeur des limites de la collectionView par le nombre de cellules que vous souhaitez insérer à l'écran. Utilisez la hauteur si votre collectionView défile horizontalement ou la largeur si elle défile verticalement.la source
[self.collectionView.collectionViewLayout invalidateLayout];
?invalidateLayout
redessine les cellules avec la bonne taille, mais-performBatchUpdates:completion:
animera les changements, ce qui semble beaucoup plus agréable à mon humble avis.didRotateFromInterfaceOrientation
obsolète dans iOS 8coordinator.animateAlongsideTransition
àviewWillTransitionToSize
et appelerperformBatchUpdates
dans sonanimation
bloc. Cela donne un bel effet d'animation.Si vous ne voulez pas d'animations supplémentaires
performBatchUpdates:completion:
, utilisez simplementinvalidateLayout
pour forcer la collectionViewLayout à se recharger.la source
J'ai résolu en utilisant deux UICollectionViewFlowLayout. Un pour le portrait et un pour le paysage. Je les assigne à ma collectionView dinamically dans -viewDidLoad
Ensuite, j'ai simplement modifié ma collectionViewFlowLayoutDelgate Méthodes comme celle-ci
Enfin, je passe d'une mise en page à une autre lors de la rotation
la source
Il existe un moyen simple de définir la taille de cellule de la vue de collection:
Je ne sais pas si c'est animable.
la source
Swift: cellule de vue de collection qui représente n% de la hauteur de l'écran
J'avais besoin d'une cellule qui représentait un certain pourcentage de la hauteur des vues et qui serait redimensionnée avec la rotation de l'appareil.
Avec l'aide d'en haut, voici la solution
la source
Si vous utilisez
autolayout
.Vous avez juste besoin deinvalidate layout
dans votre contrôleur de vue lors de la rotation et du réglageoffset
dans votre sous-classe de disposition de flux.Donc, dans votre contrôleur de vue -
Et dans votre
FlowLayout Subclass
la source
willRotateToInterfaceOrientation
est obsolète dans iOS 8 maisviewWillTransitionToSize
fonctionne aussi bien pour cela.