custom ios uicollectionview uicollectionviewlayout

ios - custom - uicollectionview layout



Stop Single UICollectionView cell Fluyendo al centro de la pantalla (2)

Estoy tratando de entender por qué Collection View mantiene el centro alineando solo la última celda de una colección.
He creado una vista de colección basada en el diseño de flujo simple. Estoy usando la bandera de Autolayout, que no estoy seguro está causando este problema.

Cada vez que elimino una celda de la vista Colección, las primeras parecen funcionar bien y girar hacia la izquierda. Sin embargo, cuando elimino el segundo último, de repente la última celda cambia de alinearse a la izquierda para alinearse en el centro. ¿Alguien tiene una explicación? Parece extraño.

¿Cómo lo hago para que todas las celdas giren hacia la izquierda y permanezcan alineadas a la izquierda?

Editar: aquí está la depuración de jerarquía de vista: http://imgur.com/a/NxidO

Aquí está la vista Comportamiento

He creado un github simple para probarlo: https://github.com/grantkemp/CollectionViewIssue

y aquí está el código:

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]) }


Cuando se muestre la última celda (solo), intente ver la depuración -> capturar la jerarquía de vistas (es decir, suponiendo que se ejecutó en el simulador). Mi corazonada: su celda está creciendo de tamaño una vez que le quede solo una


Pude resolver esto usando los dos pasos siguientes: 1. Inicié un error con Apple sobre el extraño comportamiento que noté sobre el cambio de comportamiento de la celda cuando usé UICollectionViewFlowLayoutAutomaticSize 2. Hice un cambio creando un CustomViewFlowLayout modificado (no puedo encontrarlo) la pregunta original SO / github donde vi que se usaba este enfoque, lo agregaré si lo encuentro) Luego agregué la configuración UICollectionViewFlowLayoutAutomaticSize, y funciona muy bien.

Código de muestra:

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

En ViewController, debe agregar el diseño de flujo a la vista de colección para que funcione:

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

Creo que la implementación de Collection View definitivamente se puede simplificar, pero voy a analizarlo más ya que puedo ver lo poderoso que es.