Acabo de comenzar a aprender sobre UICollectionViews. Me pregunto si alguien sabe cómo especificar el número de columnas en una vista de colección. El valor predeterminado es 3 (iPhone / retrato). He mirado la documentación y parece que no puedo encontrar una respuesta concisa.
100
UICollectionView
básicamente como una cuadrícula porque sé que solo quiero 4 columnas. Hago esto haciendo que mis celdas tengan un tamaño determinado y el espacio entre ellas de un tamaño determinado para que la vista de colección solo muestre 4 columnas, sin importar la orientación. ¿Es esto similar a lo que necesitas?Respuestas:
CollectionViews son muy poderosos y tienen un precio. Muchas y muchas opciones. Como dijo omz:
Sugeriría implementar el
<UICollectionViewDelegateFlowLayout>
Protocolo, dándole acceso a los siguientes métodos en los que puede tener un mayor control sobre el diseño de suUICollectionView
, sin la necesidad de subclasificarlo:collectionView:layout:insetForSectionAtIndex:
collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
collectionView:layout:minimumLineSpacingForSectionAtIndex:
collectionView:layout:referenceSizeForFooterInSection:
collectionView:layout:referenceSizeForHeaderInSection:
collectionView:layout:sizeForItemAtIndexPath:
Además, la implementación del siguiente método obligará a su UICollectionView a actualizar su diseño en un cambio de orientación: (digamos que desea cambiar el tamaño de las celdas para el paisaje y estirarlas)
Además, aquí hay 2 tutoriales realmente buenos sobre
UICollectionViews
:http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12
http://skeuo.com/uicollectionview-custom-layout-tutorial
fuente
collectionView:layout:sizeForItemAtIndexPath:
manejarse para todos los dispositivos por separado?new GridLayoutManager(mContext, 4))
(4 columnas), muy fácil, o simplemente usarLinearLayoutManager
(por supuesto, solo tiene 1 columna)Con Swift 5 y iOS 12.3, puede usar una de las 4 siguientes implementaciones para establecer la cantidad de elementos por fila en su
UICollectionView
mientras administra inserciones y cambios de tamaño (incluida la rotación).# 1. Subclasificación
UICollectionViewFlowLayout
y usoUICollectionViewFlowLayout
de laitemSize
propiedadColumnFlowLayout.swift:
CollectionViewController.swift:
# 2. Usando
UICollectionViewFlowLayout
elitemSize
método de# 3. Usando
UICollectionViewDelegateFlowLayout
elcollectionView(_:layout:sizeForItemAt:)
método de# 4. Subclasificación
UICollectionViewFlowLayout
y usoUICollectionViewFlowLayout
de laestimatedItemSize
propiedadCollectionViewController.swift:
FlowLayout.swift:
Cell.swift:
fuente
Implementé
UICollectionViewDelegateFlowLayout
en myUICollectionViewController
anule el método responsable de determinar el tamaño de la celda. Luego tomé el ancho de la pantalla y lo dividí con el requisito de mi columna. Por ejemplo, quería tener 3 columnas en cada tamaño de pantalla. Así que así es como se ve mi código:fuente
Ampliando la respuesta del novato:
Esto permite cualquier espacio entre las celdas. Asume una
Int
variable miembro llamadanumberOfItemsPerRow
y también que todas las celdas son cuadradas y del mismo tamaño. Como se señaló en la respuesta de jhilgert00, también debemos reaccionar a los cambios de orientación, pero ahora al usarviewWillTransitionToSize
aswillRotateToInterfaceOrientation
se deprecia.fuente
Aquí está el código de trabajo para Swift 3, para tener un diseño de dos columnas:
No dude en cambiar "nbCol" al número de columnas que desee.
fuente
Si eres vago usando delegate.
PD: También debería llamarse después de la rotación
fuente
Actualizado a Swift 3:
En lugar del diseño de flujo, prefiero usar un diseño personalizado para un número de columna y un número de fila específicos. Porque:
Celda normal y celda de encabezado: (agregue UILabel como IBOutlet a su xib):
Diseño personalizado:
CollectionView:
Utilice CollectionView desde ViewController:
¡Finalmente puedes tener CollectionView elegante!
fuente
Debido a que
UICollectionView
es tan flexible, hay varias formas de cambiar el número de columnas, según el tipo de diseño que utilice.El
UICollectionViewFlowLayout
(que es probablemente con lo que está trabajando) no especifica un número de columnas directamente (porque depende del tamaño / orientación de la vista). La forma más sencilla de cambiarlo sería establecer laitemSize
propiedad y / ominimumInteritemSpacing
/minimumLineSpacing
.fuente
Swift 3.0. Funciona para direcciones de desplazamiento horizontal y vertical y espaciado variable
Especifique el número de columnas
Configurar
flowLayout
para renderizar especificadonumberOfColumns
fuente
Actualizado a Swift 5+ iOS 13
Collectionview El tamaño estimado no debe ser ninguno
Declarar margen para celda
En viewDidLoad configurar
minimumInteritemSpacing
,minimumLineSpacing
,sectionInset
Método UICollectionViewDataSource
sizeForItemAt
fuente
Se trata de un diseño que quieres dibujar. Puede crear una clase personalizada heredando de UICollectionViewFlowLayout. Actualmente no existe ningún método directo para configurar columnas. Si desea lograr este tipo de funcionalidad, debe hacerlo manualmente. Debe manejarlo en su clase de diseño de flujo personalizado.
Ahora surgirá la pregunta de cómo lo harás. Si no desea alterar el marco de la celda, puede ajustar
Otra forma es proporcionarle sus propias posiciones de celdas. Anulando los siguientes dos métodos, que se llamarán durante la formación de su diseño.
UICollectionViewLayoutAttributes es una clase que se ocupará de la posición de la celda, el marco, Zindex, etc.
fuente
Esta respuesta es para swift 3.0 ->
primero se ajusta al protocolo:
luego agregue estos métodos:
fuente
Solo quería agregar a la respuesta n. ° 2 de Imanou Petit. Para garantizar que los márgenes sean exactos independientemente del ancho de la pantalla, utilizo un solucionador iterativo con un margen deseado y el número de columnas como entradas. También agregué una bandera direccional sobre dónde se compararán sus márgenes finales con su objetivo.
El solucionador iterativo se muestra a continuación y devuelve cellWidth y margin.
Yo lo llamo así:
Luego aplico los valores de cellWidth y margin al diseño de flujo como tal:
{func collectionView (_ collectionView: UICollectionView, diseño collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {return CGSize (width: cellWidth, height: cellWidth)}
}
Espero que esto ayude. Probablemente haya una forma más fácil de garantizar que los márgenes sean exactos, pero este es un método. Además, este código no se ha probado para dispositivos que permiten la rotación de vistas de colección.
Gracias,
fuente
la solución perfecta es usar UICollectionViewDelegateFlowLayout, pero puede calcular fácilmente el ancho de la celda y dividirlo en el número deseado de columnas que desee
lo complicado es hacer el ancho sin fracción
fuente
Hice un diseño de colección.
Para hacer visible el separador, establezca el color de fondo de la vista de colección en gris. Una fila por sección.
Uso:
Diseño:
fuente
Prueba esto, funciona perfecto para mí
Siga los pasos a continuación:
1. Defina valores en el archivo .h.
O
2.Agregue el código en los métodos de fuente de datos de diseño de vista de colección como se muestra a continuación,
Espero que esto sea de ayuda para alguien.
fuente
Primero agregue UICollectionViewDelegateFlowLayout como protocolo.
Luego:
fuente