He investigado un poco, pero no pude encontrar ningún ejemplo de código sobre cómo centrar celdas en una UICollectionView horizontalmente.
en lugar de que la primera celda sea así X00 , quiero que sea así 0X0 . ¿Hay alguna forma de lograr esto?
EDITAR:
para visualizar lo que quiero:
Necesito que se parezca a la versión B cuando solo hay un elemento en CollectionView. Cuando obtuve más de un elemento, debería ser como la versión A pero con más elementos.
En este momento, se parece a la Versión A cuando tengo solo 1 elemento, y me pregunto cómo puedo hacer que se parezca a B.
¡Gracias por la ayuda!
Respuestas:
No es una buena idea usar una biblioteca, si su propósito es solo esto, es decir, alinear al centro.
Mejor puede hacer este cálculo simple en su función collectionViewLayout.
fuente
collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int)
.leftInset
valor de la siguiente manera:let leftInset = max(0.0, (self.collectionView.bounds.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2)
Swift 5.1
Swift 4.2
Swift 3
no olvides agregar el protocolo
fuente
Prueba esto para Swift 4
Agregue su cellWidth en su lugar 165.0
fuente
Utilizo KTCenterFlowLayout para esto, y funciona muy bien. Es una subclase personalizada
UICollectionViewFlowLayout
que centra las celdas como desee. (Nota: esto no es algo trivial para resolver publicando algo de código, ¡por eso me estoy vinculando a un proyecto de GitHub!)fuente
Una versión del objetivo C de la respuesta de Darshan Patel :
fuente
Modificando ligeramente la respuesta de @Safad Funy, esto es lo que funcionó para mí en la última versión de Swift e iOS. En este caso, quería que el ancho de las celdas fuera un tercio del tamaño de la vista de colección.
fuente
Puede usar esta extensión (Swift 4).
Puede centrar celdas con si
collectionView
tienelayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
.Funciona con cualquier tamaño de celda y funciona perfectamente cuando
scrollDirection = .horizontal
Espero que sea de ayuda!
fuente
Swift 4.2 (horizontal y verticalmente). ¡Es una pequeña actualización del código de Pink Panther y muchas gracias!
Asegúrese de que su clase cumpla con el protocolo UICollectionViewDelegateFlowLayout
fuente
Aquí está la versión más nueva para Swift 5 que también funciona bien cuando las celdas son más de una fila:
Asegúrese de que su clase cumpla con el
UICollectionViewDelegateFlowLayout
protocolo.fuente
Swift 4
fuente
Para las personas que solo desean agregar un relleno ( arriba, izquierda, abajo, derecha ):
Agregar el protocolo
UICollectionViewDelegateFlowLayout
Este ejemplo muestra un relleno izquierdo y derecho con 40.
fuente
SWIFT 4.2
//
fuente
Puedes probar mi solución, funciona bien,
fuente
La respuesta aceptada es la correcta, pero si su
totalCellWidth
es menor que la deCollectionView
's'width
, pero solo para protegerse de esto, puede hacer lo siguiente.fuente
Este código debe centrar la vista de recopilación horizontal incluso en Swift 4.0 sin ninguna modificación:
Asegúrese de que su clase cumpla con el
UICollectionViewDelegateFlowLayout
protocolofuente
Terminé tomando un enfoque completamente diferente aquí, que creo que vale la pena mencionar.
Establezco una restricción en mi vista de colección para que esté alineada horizontalmente en el centro. Luego establecí otra restricción que especifica el ancho. Creé una salida para la restricción de ancho dentro de mi viewController que contiene la vista de colección. Luego, cuando se cambia mi fuente de datos y estoy actualizando la vista de recopilación, tomo el recuento de las celdas y hago un cálculo (muy similar) para restablecer el ancho.
let newWidth = (items.count * cellWidth) + (items.count * cellSpacing)
Luego establezco el
.constant
valor de la salida de restricción en el resultado del cálculo y la distribución automática hace el resto.Esto puede entrar en conflicto con `UICollectionViewDelegateFlowLayout, pero esto funcionó perfectamente para crear una vista de colección justificada a la izquierda. Sin un delegado, solo parece funcionar cuando las celdas llenan la mayoría de la vista.
fuente
Solución general para flowlayout que centra las páginas si son menores que el ancho y se alinea a la izquierda si hay más
Versión rápida (convertida de ObjC)
fuente
Tengo una situación similar en el proyecto, y lo arreglé refiriéndome
UPCarouselFlowLayout
Creo que es compatible con la
swift 5
versiónhttps://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift
Mira la implementación del código en
fuente
la forma más simple es establecer el tamaño estimado de la vista de colección en Ninguno en el guión gráfico o con código
layout.estimatedItemSize = CGSize.zero
fuente
Si sólo hay espacio para una célula por grupo, una
leading:
ytrailing:
del.flexible(0)
centrará la celda horizontalmente:fuente
Usé ese código en un proyecto. Centra el collectionView horizontal y verticalmente en ambas direcciones
.horizontal
y.vertical
usando las inserciones de sección. Respeta el espaciado y el recuadro original de la sección si está configurado. Código para usar en el delegadoUICollectionViewDelegateFlowLayout
para que tengamos acceso a todas las propiedades que necesitamos recuperar delUIcollectionView
o establecer en el guión gráfico para su reutilización.Espero que ayude a alguien: centra la sección, no los elementos dentro de la sección, para más tenemos que subclasificar el
UICollectionViewFlowLayout
oUICollectionViewLayout
como el ejemplo de mosaico de Apple.fuente
Creo que necesita centrar la celda, por lo que en lugar de usar collectionView, me gustaría que UITableView sea de gran utilidad. Simplemente use un UIViewController y coloque dos UIViews al frente y atrás y coloque un
UITableView
en el medio Espero que esto ayudefuente