Estoy usando un UICollectionView
with UICollectionViewFlowLayout
.
Establecí el tamaño de cada celda a través del
collectionView:layout:sizeForItemAtIndexPath:
Al cambiar de retrato a paisaje, me gustaría ajustar el tamaño de cada celda para que se ajuste completamente al tamaño de CollectionView, sin dejar espacio de relleno entre las celdas.
Preguntas:
1) ¿Cómo cambiar el tamaño de una celda después de un evento de rotación?
2) Y, aún mejor, ¿cómo hacer el diseño donde las celdas siempre quepan en todo el tamaño de la pantalla?
ios
uicollectionview
uicollectionviewcell
Fmessina
fuente
fuente
sizeForItemAtIndexPath
antes de llamardidRotateFromInterfaceOrientation
. Sin embargo, para una vista de colección con varias celdas en pantalla, invalidar el diseño antes de la rotación provoca un salto visible y desagradable en el tamaño antes de que la vista gire. En ese caso, creo que mi respuesta sigue siendo la implementación más correcta.I would like to adjust the size of each cell to **completely fit the size of the CollectionView**
cuál es exactamente la solución propuesta en mi respuesta. Si pudiera incluir mi solución en su respuesta y tomar nota de qué enfoque funciona mejor en qué condiciones, sería lo suficientemente bueno para mí.Respuestas:
1) Puede mantener e intercambiar varios objetos de diseño, pero hay una forma más sencilla. Simplemente agregue lo siguiente a su
UICollectionViewController
subclase y ajuste los tamaños según sea necesario:Llamar
-performBatchUpdates:completion:
invalidará el diseño y cambiará el tamaño de las celdas con animación (puede pasar nulo a ambos parámetros de bloque si no tiene ajustes adicionales que realizar).2) En lugar de codificar los tamaños de los elementos
-collectionView:layout:sizeForItemAtIndexPath
, simplemente divida la altura o el ancho de los límites de collectionView por la cantidad de celdas que desea que quepan en la pantalla. Use la altura si su collectionView se desplaza horizontalmente o el ancho si se desplaza verticalmente.fuente
[self.collectionView.collectionViewLayout invalidateLayout];
?invalidateLayout
volverá a dibujar las celdas con el tamaño correcto, pero-performBatchUpdates:completion:
animará los cambios, lo que se ve mucho mejor en mi humilde opinión.didRotateFromInterfaceOrientation
obsoleto en iOS 8coordinator.animateAlongsideTransition
enviewWillTransitionToSize
, y llamandoperformBatchUpdates
dentro de suanimation
bloque. Esto le da un bonito efecto de animación.Si no desea que le traigan animaciones adicionales
performBatchUpdates:completion:
, useinvalidateLayout
para forzar la recarga de collectionViewLayout.fuente
Resolví usando dos UICollectionViewFlowLayout. Uno para retrato y otro para paisaje. Los asigno a mi collectionView dinámicamente en -viewDidLoad
Luego simplemente modifiqué mis métodos collectionViewFlowLayoutDelgate como este
Por último, cambio de un diseño a otro en rotación
fuente
Hay una forma sencilla de establecer el tamaño de celda de la vista de colección:
Sin embargo, no estoy seguro de si es animable.
fuente
Swift: celda de vista de colección que es n% de la altura de la pantalla
Necesitaba una celda que tuviera un cierto porcentaje de la altura de las vistas y que cambiara de tamaño con la rotación del dispositivo.
Con la ayuda de arriba, aquí está la solución.
fuente
Si está usando
autolayout
.Solo necesita hacerloinvalidate layout
en su controlador de vista al rotar y ajustaroffset
en su subclase de diseño de flujo.Entonces, en su controlador de vista -
Y en tu
FlowLayout Subclass
fuente
willRotateToInterfaceOrientation
está obsoleto en iOS 8, peroviewWillTransitionToSize
funciona igual de bien para esto.