Cómo centrar verticalmente el contenido de UICollectionView

Estoy intentando centrar dinámicamente el contenido de UICollectionView, pero ninguna de las soluciones existentes tiene en count el hecho de que puede haber más de una celda por fila.

He probado este título personalizado de centro en UINavigationBar? así como ambas soluciones aquí: UICollectionView verticalmente centrado , en vano.

Estoy bastante sorprendido de que iOS no ofrece ninguna forma de hacerlo de forma pnetworkingeterminada y, aún más, que no es posible get el número de filas que se muestran actualmente (lo que también habría resuelto mi problema). Además, no puedo get el tamaño del contenido (y no simplemente el tamaño del marco), lo que también me ayudó a lograr el efecto deseado.

Tengo esto:

-------- |XXXX | |XXXX | | | | | -------- 

Pero quiero esto:

  -------- | | |XXXX | |XXXX | | | -------- 

Cualquier ayuda sería muy apreciada,

Muchas gracias.

Ahora entiendo tu problema. Según el tamaño de la pantalla, necesita otro recuadro para que se vea centrado. Entonces tienes que calcularlo manualmente, pero no debería ser tan difícil. Conoces el espacio disponible, la cantidad de elementos y el tamaño de la celda. Solo calcula la inserción de la sección desde la parte superior.

No está seguro de por qué no puede get el tamaño del contenido: UICollectionView es una subclass UIScrollView , por lo tanto, tiene acceso a la propiedad contentSize . Si solo necesita centrar las celdas en caso de que sean visibles sin desplazarse, puede hacer lo siguiente:

 collectionView.contentInset.top = max((collectionView.frame.height - collectionView.contentSize.height) / 2, 0) 

Esto también funcionará en los casos en que crezca el número de celdas para que no todos estén visibles en la pantalla y comience a usar el desplazamiento vertical; la inserción superior se establecerá en 0 .

UICollectionView tiene una propiedad visibleCells que devuelve una matriz. Puede usar la propiedad count en NSArray para get el número de celdas visibles.

Debería poder implementar - collectionView:layout:insetForSectionAtIndex: en la implementación de su delegado para establecer el recuadro superior a algo que dará como resultado el centrado que está grabando.

También puede subclass UICollectionViewFlowLayout e implementar su propia lógica de layout si es necesario.

Si tienes una tabBar haz esto

 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { let navBarHeight = self.navigationController?.navigationBar.frame.height let collectionViewHeight = (self.collectionView?.frame.height)! - navBarHeight! let itemsHeight = self.collectionView?.contentSize.height let topInset = ( collectionViewHeight - itemsHeight! ) / 4 return UIEdgeInsetsMake(topInset ,0, 0 , 0) } 

Si no ignora la substracción tabBar y deja el rest …