UICollectionView - redimensionnement des cellules du dispositif de rotation - Swift
J'ai créé un UICollectionView, afin que je puisse organiser des vues de l'soigné colonnes. J'aimerais qu'il y ait une seule colonne sur les périphériques > 500 pixels de large.
Afin de parvenir à cela, j'ai créé cette fonction:
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let size = collectionView.frame.width
if (size > 500) {
return CGSize(width: (size/2) - 8, height: (size/2) - 8)
}
return CGSize(width: size, height: size)
}
Cela fonctionne comme prévu sur la première charge, cependant lorsque je l'ai faites pivoter l'appareil, le calcul n'est pas toujours le cas à nouveau, et les points de vue ne sont pas toujours redessiner comme prévu. Voici mon code pour lors de la rotation de l'appareil:
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
collectionView.collectionViewLayout.invalidateLayout()
self.view.setNeedsDisplay()
}
Je suppose que j'ai oublié de redessiner quelque chose, mais je ne suis pas sûr de ce que. Toutes les idées sont très gratitude reçu!
- Cela peut aider quelqu'un stackoverflow.com/questions/13490065/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
viewWillLayoutSubviews
. Cette question doit être utile, mais c'est bassically appelée chaque fois que la vue-contrôleur les vues est à la disposition de ses sous-vues.De sorte que votre code devrait ressembler à ceci:
viewWillTransitionToSize
.viewWillTransitionToSize
approche.Peut-être la plus simple façon de faire cela est de invalidateLayout au cours de la viewWillTransitionToSize:
J'ai tendance à utiliser
viewWillTransitionToSize
avec la même chose et tout simplement fait un appelinvalidateLayout()
là.J'ai utilisé la méthode suivante, qui a travaillé pour moi.
Problème avec moi, c'était que j'étais d'invalider la mise en
viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)
Mais à ce point (comme cette méthode nom l'indique) de l'Appareil n'a pas été tourné encore.
Donc, cette méthode sera appelée avant
viewWillLayoutSubviews
et donc dans cette méthode, nous n'avons pas le droit de limites et d'images (Zone de Sécurité) comme appareil tournera par la suite.J'ai donc utilisé les notifications
et puis, en vue de collection de flux de délégué méthode tout fonctionne comme prévu.
traitCollectionDidChange
méthode peut être utilisée aussi bien au lieu deviewWillLayoutSubviews
:D'avoir la collection de redimensionner vue de ses cellules, et que le changement d'animation lors de la rotation, utilisez le coordonnateur de la transition:
(Swift 4+)
J'avais une tâche à régler des éléments de taille dans UICollectionView sous-classe. La meilleure méthode pour cela est setFrame. Propriété collectionViewFlowLayout j'ai passé de ViewController (dans mon cas, elle a été prise à partir de flux par défaut de mise en page).
Vous pouvez créer un masque de contenu et le déplacer vers le collectionView. Après le portrait/paysage de l'animation est terminée, vous devez l'enlever dès que possible.
Voici un exemple:
C'est pour les autres, avec peut-être même cas spécial.
Situation:
J'ai inclus une
UICollectionView
comme unUITableViewCell
dans une table view controller. La hauteur de ligne a été mis àUITableViewAutomaticDimension
pour s'adapter sur le nombre de cellules dans l'affichage de la collection. Il n'a pas de mise en page correctement sur l'appareil de rotation bien que d'autres cellules avec du contenu dynamique dans la même vue de la table se sont comportés correctement. Après une longue recherche, j'ai trouvé une solution qui a fonctionné: