Solo es la segunda vez que uso UICollectionView's y quizás he mordido más de lo que puedo masticar, pero sin embargo:
Estoy implementando un UICollectionView (myCollectionView) que usa UICollectionViewCell personalizado que he subclasificado. Las celdas de subclases (FullReceiptCell) contienen UITableView y son del tamaño del controlador de vista. Estoy tratando de permitir el desplazamiento horizontal entre FullReceiptCells.
El UICollectionViewController subclasificado que contiene myCollectionView se está insertando en una pila de controlador de navegación. Actualmente, myCollectionView loas y el desplazamiento horizontal están habilitados. Sin embargo, no se ven celdas. He confirmado que
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
se ha ejecutado y está devolviendo un número entero mayor que 0. También he confirmado que el delegado y la fuente de datos de myCollectionView están configurados correctamente en IB para el UICollectionViewController subclasificado.
El método donde se cargarán las celdas:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
no está siendo llamado.
Aquí es donde presiono el UICollectionViewController y mi método viewDidLoad dentro de ese controlador (NOTA: initWithBill es una anulación del inicializador normal):
En el archivo .m anterior de ViewControllers:
FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];
En FullReceiptViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
self.myCollectionView.pagingEnabled = YES;
// Setup flowlayout
self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
[self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
[self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
[self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
//testing to see if the collection view is loading
self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];
¿Alguna pista de por qué no se llama?
fuente
Respuestas:
Para aquellos que tropiezan aquí más tarde ... la razón:
no se estaba llamando porque el itemSize de la colecciónViewFlowLayout era demasiado grande.
Si cambio la altura a 410, ejecutará cellForItemAtIndexPath.
fuente
Adjust Scroll View Insets
en su ViewController en Storyboard.En mi caso, fue porque mi clase de diseño subclasificó incorrectamente de en
UICollectionViewLayout
lugar deUICollectionViewFlowLayout
fuente
No se llamará a cellForItemAtIndexPath si no proporciona la información del tamaño del contenido a la vista de colección.
En el caso de este último, también observará que su layoutAttributesForElementsRect tampoco se llama. La razón es que no ha especificado cuál es el tamaño de su contenido y, por defecto, el tamaño será CGSizeZero. Básicamente, esto le dice a la vista de colección que no tiene ningún contenido para pintar, por lo que no se molesta en pedirle atributos o celdas.
Entonces, simplemente anule collectionViewContentSize y proporcione un tamaño adecuado allí, debería resolver su problema.
fuente
collectionViewContentSize
0 devuelto incorrectamente para el ancho, es por eso quecellForItemAtIndexPath
no se llamaba.Tal vez lo esté pasando por alto, pero parece que le falta su delegado y su fuente de datos. En su archivo de encabezado, asegúrese de haber agregado estos:
y en su método viewDidLoad agregue esto:
Además, si lo está cargando a través de un .xib, asegúrese de haber conectado IBOutlet a UICollectionView.
fuente
Para obtener una jerarquía de vistas más complicada, consulte este blog . ¡Me salvó la vida!
fuente
Si su clase es una subclase de UICollectionviewController y está creando collectionView programáticamente, use
fuente
Estaba usando el diseño automático y, en mi caso, faltaba la restricción de altura
fuente
Mi problema era que tenía 2 vistas de colección dentro de la misma vista y ambas compartían una
UICollectionViewFlowLayout
instancia calculada . Una vez que creé instancias separadas del mismo diseño de flujo, funcionó bien.fuente
En mi caso, lo que me había olvidado estúpidamente de hacer era implementar el
UICollectionViewDataSource
método del protocolonumberOfItemsInSection
, así que eso es otra cosa que verificar.fuente
Además, asegúrese de que no se llame a reloadData mientras la vista de colección se actualiza con animación (insertar, eliminar, actualizar o realizarBatchUpdates).
fuente
En mi caso, set
collectionView.prefetchingEnabled = NO;
resolvió mi problema. Solo funciona en iOS 10.fuente
Me estaba sucediendo cuando la altura del elemento == 0 al arreglar ese método cellForItem fue llamado.
fuente
Hace diez minutos también encontré este problema, cometí un error tonto.
Mi intención es utilizar UICollectionViewFlowLayout,
Pero debido a errores, utilicé UICollectionViewLayout.
fuente
En mi caso, cambiar el translúcido de UINavigationBar a NO resolvió el problema.
fuente
En Xcode 7.0.1, obtuvimos este problema cuando copiamos un guión gráfico y el código adjunto de otro proyecto. La vista de colección tenía un diseño de flujo personalizado establecido en el guión gráfico. La solución fue:
Ahora funcionó :)
fuente
Asegúrese de que también
numberOfSectionsInCollectionView
devuelva un número entero positivo.Tiene que haber al menos una sección en la colección.
fuente
Asegúrese de que - (NSInteger) collectionView: numberOfItemsInSection: devuelva un valor positivo (leído, mayor que cero). Puede ser cuestión de colocar [self.collectionView reloadData]; en el controlador de finalización.
fuente
Me olvidé de configurar la máscara de tamaño automático en falso en la vista de colección:
fuente
Se pueden relacionar problemas de diseño. Verifique las advertencias de diseño desde la consola, si existen.
fuente
En mi caso, la vista de la colección no era completamente visible en su vista principal debido a restricciones de diseño automático incorrectas. Así que arreglar las restricciones hizo que la vista de la colección fuera visible y se llamó a cellForItemAtIndexPath.
fuente
En la propiedad de storyboard / xib UICollectionView cellSize no DEBE ser {0, 0}
fuente
Si está utilizando protocolos de vista de colección, debe conectar los protocolos
CollectionViewDataSource
yCollectionViewDelegate
a su ViewController.fuente
Lo mismo me pasó a mí. Tenía 2 UICollectionViews y las eliminé una vez ya que no las necesitaba. Después de eso, me di cuenta de que no se llamaba a CellForItemAtIndexPath, sino a los otros métodos necesarios. Intenté todo lo anterior, pero luego hice la magia estándar. Se eliminó la vista de colección del guión gráfico y se agregó nuevamente. Entonces empezó a funcionar. No estoy seguro de por qué y no tengo una explicación, pero tal vez algunos problemas de conexión.
fuente
Acabo de resolver este problema, para una situación algo específica.
En mi caso, estaba inicializando manualmente el UICollectionViewController en un ViewController principal y luego agregando la vista de UICollectionViewController como una subvista.
Resolví el problema llamando a 'setNeedsLayout' y / o 'setNeedsDisplay' en collectionView en el viewDidAppear del padre:
fuente
Al usar,
UICollectionViewDelegateFlowLayout
tenga cuidado con lo que devuelve esta función. Amboswidth
yheight
debería ser mayor que0
. Lo uséwindow
como referencia de marco, pero debido a la complicada jerarquía de vistas, la ventana estabanil
en tiempo de ejecución. Si necesita ajustar el ancho del elemento en función del ancho de la pantalla, utiliceUIScreen.main.bounds
.fuente
En mi caso tuve el
collectionView
in aUIStackView
conalignment = .center
. Entonces elcollectionView
no tenía ancho. Al configurar elstackView.alignment
a.fill
todo estaba bien.fuente
Para mí, actualizo la altura de self.view (la supervista de collectionView) a través de autolayout, y DEBO llamar
layoutIfNeeded
después de eso.fuente
En mi caso, tuve que ajustar el tamaño estimado del Contenido. el tamaño del contenido no lo hizo.
fuente
Tenía un problema similar. Pero en su lugar
cellForItemAtIndexPath
se llamó cuando la cantidad de elementos era> 1, pero no cuando solo había un elemento. Probé muchas de las soluciones propuestas aquí y, al igual que muchas, descubrí que tenían que ver con el tamaño del artículo. Para mí, la solución fue cambiar el tamaño estimadoUICollectionView
de Automático a Personalizado .fuente
Perdí un poco de tiempo con este problema con un CollectionView en un controlador de vista contenido cargado desde un guión gráfico. Terminé simplemente eliminando el controlador de vista contenido y recrearlo en el guión gráfico, y esto pareció solucionar el problema. Supongo que se produjo algún tipo de corrupción en el guión gráfico.
fuente