Obtención de todos los frameworks de elementos visibles e invisibles Elementos UICollectionView

Tengo una UICollectionView , con 30 elementos de UICollectionViewCell interior. Los elementos visibles son 8, pero necesito get todos los 30 artículos.

Por lo que sé es que, para get la fila invisible, se necesita performBatchUpdates . Aquí está mi código.

 // some code before for (int i = 0; i < [collectionView numberOfItemsInSection:0]; i++) { cell = [collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]]; if (!cell) { [collectionView performBatchUpdates:^{ [collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:NO]; [collectionView reloadData]; } completion:^(BOOL finished) { cell = [collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]]; NSLog(@"- after batch update %d %@", i, NSStringFromCGRect(cell.frame)); }]; } NSLog(@"- %d %@", i, NSStringFromCGRect(cell.frame)); } // another long code 

Los resultados fueron los primeros 8 elementos con el valor del marco derecho. El siguiente valor de cuadro de 22 elementos invisibles fue falso. El logging (que contiene los valores del marco derecho) aparece después del final del ciclo.

 2013-07-08 16:38:57.904 My App[71245:c07] - 0 {{2, 2}, {217, 326}} 2013-07-08 16:38:57.905 My App[71245:c07] - 1 {{231, 2}, {217, 326}} 2013-07-08 16:38:57.906 My App[71245:c07] - 2 {{460, 2}, {217, 326}} 2013-07-08 16:38:57.906 My App[71245:c07] - 3 {{689, 2}, {217, 315}} 2013-07-08 16:38:57.907 My App[71245:c07] - 4 {{689, 340}, {217, 326}} 2013-07-08 16:38:57.909 My App[71245:c07] - 5 {{2, 340}, {217, 329}} 2013-07-08 16:38:57.909 My App[71245:c07] - 6 {{231, 340}, {217, 315}} 2013-07-08 16:38:57.910 My App[71245:c07] - 7 {{460, 340}, {217, 286}} 2013-07-08 16:38:57.910 My App[71245:c07] - 8 {{0, 0}, {0, 0}} 2013-07-08 16:38:57.911 My App[71245:c07] - 9 {{0, 0}, {0, 0}} 2013-07-08 16:38:57.911 My App[71245:c07] - 10 {{0, 0}, {0, 0}} 2013-07-08 16:38:57.912 My App[71245:c07] - 11 {{0, 0}, {0, 0}} 2013-07-08 16:38:57.912 My App[71245:c07] - 12 {{0, 0}, {0, 0}} 2013-07-08 16:38:57.913 My App[71245:c07] - 13 {{0, 0}, {0, 0}} 2013-07-08 16:38:57.913 My App[71245:c07] - 14 {{0, 0}, {0, 0}} 2013-07-08 16:38:57.904 My App[71245:c07] - after batch update 8 {{689, 640}, {217, 326}} 2013-07-08 16:38:57.905 My App[71245:c07] - after batch update 9 {{689, 640}, {217, 326}} 2013-07-08 16:38:57.906 My App[71245:c07] - after batch update 10 {{2, 640}, {217, 326}} 2013-07-08 16:38:57.906 My App[71245:c07] - after batch update 11 {{231, 640}, {217, 315}} 2013-07-08 16:38:57.907 My App[71245:c07] - after batch update 12 {{460, 920}, {217, 326}} 2013-07-08 16:38:57.909 My App[71245:c07] - after batch update 13 {{2, 920}, {217, 329}} 2013-07-08 16:38:57.909 My App[71245:c07] - after batch update 14 {{231, 920}, {217, 315}} 

¿Cómo debo hacer para get el valor de cuadro de 30 elementos, el marco visible e invisible?

EDITADO

Tengo una vista de tabla que contiene 30 UITableViewCell s (30, el mismo valor que mi uicollectionviewcell), todos son visibles. Y quiero crear animation usándolo. La animation está moviendo la celda de la tabla 30 a cada celda de uicollectionview. Es por eso que necesito esos frameworks.

No es necesario hacer que las celdas sean visibles para get su marco, la vista de colección gestiona los frameworks (y otros attributes de layout) en su collectionViewLayout , para que pueda get los frameworks a partir de eso.

 NSInteger numberOfCells = [self.collectionView numberOfItemsInSection:0]; UICollectionViewLayout *layout = self.collectionView.collectionViewLayout; for (NSInteger i = 0; i < numberOfCells; i++) { UICollectionViewLayoutAttributes *layoutAttributes = [layout layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]]; CGRect cellFrame = layoutAttributes.frame; NSLog(@"%i - %@", i, NSStringFromCGRect(cellFrame)); } 

Me enfrentaba a un problema similar cuando necesitaba capturar una image de una vista de colección cuyas celdas se extendían más allá del rectángulo visible. Necesitaba algo más que la información de layout en todas las celdas; Necesitaba el sistema para dibujar realmente la vista de colección completa. Intenté usar el método scrollToItemAtIndexPath para barrer mediante progtwigción a través de la vista para forzar el dibujo de todo antes de capturar la image, pero sin suerte.

La solución fue, dentro del método de captura de imágenes, configurar el marco de vista de colección para que coincida con el tamaño de contenido completo y invocar el invalidate layout , lo que obligó a la vista a llamar a los attributes de layout para todo en toda la vista. Después de capturar la image, restauré la vista de colección en su tamaño de interfaz de usuario original, y funcionó perfectamente:

 - (UIImage *)getImageOfEntireCollectionView { // Store original CV frame and get content size CGPoint refCVOrigin = self.collectionView.frame.origin; CGSize refCVSize = self.collectionView.frame.size; CGSize contentSize = [self.collectionView.collectionViewLayout collectionViewContentSize]; // expand CV size to match content size and networkingraw it self.collectionView.frame = CGRectMake(0, 0, contentSize.width, contentSize.height); [self.layout invalidateLayout]; [self.collectionView reloadData]; // capture image of CV UIGraphicsBeginImageContext(self.collectionView.bounds.size); [self.collectionView.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); // restre original CV frame self.collectionView.frame = CGRectMake(refCVOrigin.x, refCVOrigin.y, refCVSize.width, refCVSize.height); return screenshot; } 

La vista UICollection no almacena celdas para cada elemento de su colección. Solo para los visibles. Cuando se desplaza, simplemente reutiliza los que ya son invisibles. Entonces no puedes get properties de células inexistentes.

En MVC, debe trabajar solo con sus datos y las células visibles que presentan parte de los datos. Entonces, lo que intentas hacer es conceptualmente incorrecto.