UICollectionView: ordera las celdas horizontalmente

Entonces, básicamente, mi problema es que las celdas de mi colección de objects se orderan de arriba hacia abajo, en lugar de de izquierda a derecha.

This is what it looks like - [1][4][7] [2][5][8] [3][6][9] This is what i want - [1][2][3] [4][5][6] [7][8][9] 

Otro problema es cuando me desploop horizontalmente en lugar de mover la página por un total de 320 puntos. Solo se mueve lo suficiente para adaptarse a la celda siguiente en la vista.

 this is what it looks like - [2][3][10] [5][6][ ] [8][9][ ] this is what i want - [10][ ][ ] [ ][ ][ ] [ ][ ][ ] 

Tenía la esperanza de que hacerlo horizontalmente lo solucionaría sin embargo. Todavía soy nuevo en ios, así que por favor, muéstrame cómo hacerlo, todas las búsquedas que busqué no son para mi problema exacto o están desactualizadas.

Esta es mi solución, espero que sea útil:

 CELLS_PER_ROW = 4; CELLS_PER_COLUMN = 5; CELLS_PER_PAGE = CELLS_PER_ROW * CELLS_PER_COLUMN; UICollectionViewFlowLayout* flowLayout = (UICollectionViewFlowLayout*)collectionView.collectionViewLayout; flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal; flowLayout.itemSize = new CGSize (size.width / CELLS_PER_ROW - delta, size.height / CELLS_PER_COLUMN - delta); flowLayout.minimumInteritemSpacing = ..; flowLayout.minimumLineSpacing = ..; .. - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { NSInteger index = indexPath.row; NSInteger page = index / CELLS_PER_PAGE; NSInteger indexInPage = index - page * CELLS_PER_PAGE; NSInteger row = indexInPage % CELLS_PER_COLUMN; NSInteger column = indexInPage / CELLS_PER_COLUMN; NSInteger dataIndex = row * CELLS_PER_ROW + column + page * CELLS_PER_PAGE; id cellData = _data[dataIndex]; ... } 

1) Si está utilizando el desplazamiento horizontal en la vista de colección, el order será como lo que tiene

 [1][4][7] [2][5][8] [3][6][9] 

Si desea que esta order cambie, debe usar el desplazamiento vertical.

2) Si desea que la vista de colección desplace una página completa, habilite el buscapersonas desde IB o

 colloctionView.pagingEnabled = YES; 

Tienes que implementar un CustomLayout para resolver este problema. Aquí está mi solución:

 /* This is what it looks like - [1][3] [5][7] [2][4] [6][8] This is what i want - [1][2] [5][6] [3][4] [7][8] */ #import "AWCustomFlowLayout.h" CGFloat const kCellWidth = 130.0; CGFloat const kCellHeight = 170.0; CGFloat const kCellLineSpacing = 20.0; CGFloat const kCellInteritemSpacing = 10.0; @implementation AWCustomFlowLayout - (instancetype)init { self = [super init]; if (self) { self.minimumLineSpacing = kCellLineSpacing; self.minimumInteritemSpacing = kCellInteritemSpacing; self.itemSize = CGSizeMake(kCellWidth, kCellHeight); self.scrollDirection = UICollectionViewScrollDirectionHorizontal; self.sectionInset = UIEdgeInsetsMake(0, kCellLineSpacing, 0, 0); } return self; } - (UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{ UICollectionViewLayoutAttributes *attribute = [super layoutAttributesForItemAtIndexPath:indexPath]; [self modifyLayoutAttribute:attribute]; return attribute; } - (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect{ NSArray *attributes = [super layoutAttributesForElementsInRect:rect]; for(UICollectionViewLayoutAttributes *attribute in attributes){ [self modifyLayoutAttribute:attribute]; } return attributes; } - (void)modifyLayoutAttribute:(UICollectionViewLayoutAttributes*)attribute{ CGRect frame = attribute.frame; NSInteger cellX = attribute.frame.origin.x; NSInteger cellY = attribute.frame.origin.y; NSInteger cellWidth = attribute.frame.size.width; NSInteger const firstColumnX = kCellLineSpacing; NSInteger const secondColumnX = kCellWidth + kCellLineSpacing*2; NSInteger const firstRowY = 0; NSInteger const secondRowY = kCellHeight + kCellInteritemSpacing; BOOL isFirstColumn = cellX % firstColumnX == 0; BOOL isSecondColumn = (cellX+cellWidth) % (secondColumnX+cellWidth) == 0; BOOL isFirstRow = cellY == firstRowY; BOOL isSecondRow = cellY == secondRowY; if (isFirstColumn && isSecondRow) { frame.origin.x += secondColumnX-firstColumnX; frame.origin.y = firstRowY; } else if (isSecondColumn && isFirstRow) { frame.origin.x -= secondColumnX-firstColumnX; frame.origin.y = secondRowY; } attribute.frame = frame; } @end