Arrêter la cellule Single UICollectionView S'écoulant au centre de l'écran

J'essaie de comprendre pourquoi Collection View conserve l'alignment au centre de la dernière cellule d'une collection.
J'ai créé une vue de collection basée sur la disposition de stream simple. J'utilise le drapeau Autolayout – qui, je ne suis pas sûr, cause ce problème.

Chaque fois que je supprime une cellule de la vue Collection – les premiers semblent fonctionner correctement et rouler vers la gauche. Cependant, quand j'enlève le second dernier, soudainement la dernière cellule change d'être alignée à gauche pour être alignée au centre. Est-ce que quelqu'un a une explication? Cela semble étrange.

Comment faire pour que toutes les cellules roulent vers la gauche et restnt alignées à gauche.

Edit: voici la vue hierachy debugging: http://imgur.com/a/NxidO

Voici la vue Comportement

Centrage de la collection

J'ai fait un simple github pour le démo: https://github.com/grantkemp/CollectionViewIssue

et voici le code:

var dataforCV = ["short","longer phrase", "Super long Phrase"] override func viewDidLoad() { super.viewDidLoad() demoCollectionView.reloadData() let layout = UICollectionViewFlowLayout() // Bug Description - > UICollectionViewFlowLayoutAutomaticSize will center Align the layout if it has only a single cell - but it will left align the content if there is more than one cell. // I would expect this behaviour to be consistently left aligning the content. //How to repeat: If you comment out UICollection​View​Flow​Layout​Automatic​Size then the collection view will show 3 cells being left aligned and it will continue to left align all the content no matter how many cells you remove. // But: if you leave turn UICollection​View​Flow​Layout​Automatic​Size on - then it will intially show 3 cells being left aligned, and then as you click to remove each cell they will stay left aligned until the last single cell will suddenly center align in the collection view // see here for the screen recording:https://i.stack.imgur.com/bledY.gif // see here for the view hierachy debuggins screen: http://imgur.com/a/NxidO layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize // <-- End Bug Description demoCollectionView.collectionViewLayout = layout } //MARk: CollectionView func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as? collectionCell cell?.text.text = dataforCV[indexPath.row] return cell! } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return dataforCV.count } //Remove the item from the array if selected func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { dataforCV.remove(at: indexPath.row) demoCollectionView.deleteItems(at: [indexPath]) } 

J'ai réussi à résoudre ceci en utilisant les deux étapes ci-dessous: 1. J'ai enregistré un bug avec Apple à propos du comportement étrange que j'ai remarqué sur le comportement de la cellule en utilisant UICollectionViewFlowLayoutAutomaticSize 2. J'ai fait un travail en créant un CustomViewFlowLayout modifié (impossible de find la question originale SO / github où j'ai vu cette approche utilisée – je vais l'append si je le trouve) J'ai ensuite ajouté le paramètre UICollectionViewFlowLayoutAutomaticSize – et son fonctionnement magnifiquement.

Exemple de code:

 class MyLeftCustomFlowLayout:UICollectionViewFlowLayout { override func layoutAtsortingbutesForElements(in rect: CGRect) -> [UICollectionViewLayoutAtsortingbutes]? { let atsortingbutes = super.layoutAtsortingbutesForElements(in: rect) var leftMargin = sectionInset.left var maxY: CGFloat = 2.0 let horizontalSpacing:CGFloat = 5 atsortingbutes?.forEach { layoutAtsortingbute in if layoutAtsortingbute.frame.origin.y >= maxY || layoutAtsortingbute.frame.origin.x == sectionInset.left { leftMargin = sectionInset.left } if layoutAtsortingbute.frame.origin.x == sectionInset.left { leftMargin = sectionInset.left } else { layoutAtsortingbute.frame.origin.x = leftMargin } leftMargin += layoutAtsortingbute.frame.width + horizontalSpacing maxY = max(layoutAtsortingbute.frame.maxY, maxY) } return atsortingbutes } 

Dans le ViewController – vous devez append la disposition de stream à la vue de collection pour le faire fonctionner:

 let layout = MyLeftCustomFlowLayout() layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize myCollectionViewReference.collectionViewLayout = layout 

Je pense que l'implémentation de Collection View peut certainement être simplifiée, mais je vais y regarder de plus près car je peux voir à quel point c'est puissant.

Lorsque la dernière cellule (uniquement) est affichée, essayez d'afficher le debugging -> capturez la hiérarchie de la vue (en supposant que vous ayez exécuté le simulateur). Mon intuition: votre cellule croît en taille une fois qu'il n'en rest qu'une