Swift: Comment actualiser UICollectionView mise en page après la rotation de l'appareil
J'ai utilisé UICollectionView (flowlayout) pour construire une mise en page simple.
la largeur de chaque cellule est réglé sur la largeur de l'écran à l'aide de self.view.frame.width
mais quand je tourne le périphérique, les cellules ne sont pas mis à jour.
J'ai trouvé une fonction qui est appelée lors de la modification d'orientation :
override func willRotateToInterfaceOrientation(toInterfaceOrientation:
UIInterfaceOrientation, duration: NSTimeInterval) {
//code
}
mais je suis incapable de trouver un moyen de mettre à jour le UICollectionView disposition
Le code principal est ici:
class ViewController: UIViewController , UICollectionViewDelegate , UICollectionViewDataSource , UICollectionViewDelegateFlowLayout{
@IBOutlet weak var myCollection: UICollectionView!
var numOfItemsInSecOne: Int!
override func viewDidLoad() {
super.viewDidLoad()
numOfItemsInSecOne = 8
//Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
//Dispose of any resources that can be recreated.
}
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
//print("orientation Changed")
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return numOfItemsInSecOne
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellO", forIndexPath: indexPath)
return cell
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{
let itemSize = CGSize(width: self.view.frame.width, height: 100)
return itemSize
}}
Vous devez vous connecter pour publier un commentaire.
Ajouter cette fonction:
Lorsque vous modifiez l'orientation, cette fonction sera appelée.
collectionView
de la propriété, de sorte que vous les appelez comme je l'ai dit. Il suffit de modifier danscollectionView.reloadData()
. Il va travailler..invalidateLayout()
fait beaucoup beaucoup de sens.viewDidLayoutSubviews
fait mon appli crash lors du retour portrait car ancien tracé cellules sont trop gros.viewWillLayoutSubviews
fonctionne parfaitementviewWillLayoutSubviews
à réellement obtenir la hauteur et la largeur des cellules re-calculé correctement... je l'avais cependant ne pas se bloquer dans les deux cas.La meilleure option est d'appeler
invalidateLayout()
au lieu dereloadData()
parce qu'il n'aura pas la force de loisirs des cellules, de sorte que les performances seront un peu mieux:viewWillLayoutSubviews
ensuite. Je parie que votre Collection de point de Vue est la vue de la Vue-Contrôleur? Si oui, je vous recommande de l'envelopper dans un autre point de vue.viewWillLayoutSubviews
? Comme il est, la mise en page n'est pas à jour correctement dans les versions d'iOS actuelles.UICollectionViewController
, parce que dans ce cas, lecollectionView
est également le point de vue du contrôleur. Donc, si vous changezcollectionView
dispositionviewWillLayoutSubviews
et les méthodes connexes seront appelés.Aussi, vous pouvez invalider dans cette voie.
La viewWillLayoutSubviews() ne fonctionne pas pour moi. Ne viewDidLayoutSubviews(). À la fois fait l'application aller dans une boucle infinie qui j'ai vérifié à l'aide d'une commande d'impression.
L'un des moyens qui ne travail est
super.viewWillTransition...
de mettre à jour
UICollectionViewLayout
traitCollectionDidChange
méthode peut être utilisée ainsi:vous pouvez mettre à jour votre UICollectionView de Mise en page à l'aide de
J'ai été aussi avoir un problème, mais cela a résolu en utilisant :
- Je résoudre ce par la définition de la notification lorsque l'orientation de l'écran change et le rechargement de la cellule qui a fixé itemsize selon l'orientation de l'écran et le réglage de indexpath à la cellule précédente. C'est le travail avec le flowlayout trop. Voici le code que j'ai écrit:
Quand
UICollectionLayout
détecte une des limites de changement, il se demande si il doit rediriger l'Invalider mise en page. Vous pouvez réécrire la méthode directement.UICollectionLayout
peuvent appelerinvalidateLayout
méthode au bon momentCela fonctionne pour moi. Et c'est le code en Objective-C:
Appel
viewWillLayoutSubviews
n'est pas optimale. Essayez d'appeler leinvalidateLayout()
d'abord la méthode.Si vous l'expérience de la
The behaviour of the UICollectionViewFlowLayout is not defined
d'erreur, vous devez vérifier si tous les éléments à l'intérieur de votre point de vue ont changé ses dimensions, d'après une nouvelle mise en page. (voir les étapes facultatives dans l'exemple de code)Voici le code, pour vous aider à démarrer. Selon la manière dont votre INTERFACE utilisateur est créé, vous pourriez avoir à expérimenter pour trouver la vue de droite pour appeler la
recalculate
méthode, mais qui devraient vous guider vers vos premiers pas.J'ai résolu la question en utilisant la méthode ci-dessous