楽しみのために、別のアプローチは、ページングと水平スクロールのセットをそのままにして、配列項目の順序を変更して「上から下、左から右」から視覚的に「左から右、上から右」に変換するメソッドを追加することです。 bottom' を選択し、中間のセルを空の非表示セルで埋めて、間隔を正しくします。9 個のグリッドに 7 個のアイテムがある場合、これは次のようになります。
[1][4][7]
[2][5][ ]
[3][6][ ]
なるべき
[1][2][3]
[4][5][6]
[7][ ][ ]
つまり、1=1、2=4、3=7 など、6=空です。行と列の総数を計算して並べ替え、各セルの行と列の番号を計算し、列の行を変更し、その逆を行うと、新しいインデックスが得られます。セルに画像に対応する値がない場合は、空のセルを返しcell.hidden = YES;
てそれに設定できます。
私が作成したサウンドボード アプリでは非常にうまく機能するので、動作するコードが必要な場合は追加します。このトリックを機能させるために必要なコードはほんのわずかです。実際よりも難しいように思えます。
アップデート
これが最善の解決策であるとは思えませんが、リクエストにより、ここに動作するコードがあります:
- (void)viewDidLoad {
// Fill an `NSArray` with items in normal order
items = [NSMutableArray arrayWithObjects:
[NSDictionary dictionaryWithObjectsAndKeys:@"Some label 1", @"label", @"Some value 1", @"value", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Some label 2", @"label", @"Some value 2", @"value", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Some label 3", @"label", @"Some value 3", @"value", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Some label 4", @"label", @"Some value 4", @"value", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Some label 5", @"label", @"Some value 5", @"value", nil],
nil
];
// Calculate number of rows and columns based on width and height of the `UICollectionView` and individual cells (you might have to add margins to the equation based on your setup!)
CGFloat w = myCollectionView.frame.size.width;
CGFloat h = myCollectionView.frame.size.height;
rows = floor(h / cellHeight);
columns = floor(w / cellWidth);
}
// Calculate number of sections
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return ceil((float)items.count / (float)(rows * columns));
}
// Every section has to have every cell filled, as we need to add empty cells as well to correct the spacing
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return rows*columns;
}
// And now the most important one
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier@"myIdentifier" forIndexPath:indexPath];
// Convert rows and columns
int row = indexPath.row % rows;
int col = floor(indexPath.row / rows);
// Calculate the new index in the `NSArray`
int newIndex = ((int)indexPath.section * rows * columns) + col + row * columns;
// If the newIndex is within the range of the items array we show the cell, if not we hide it
if(newIndex < items.count) {
NSDictionary *item = [items objectAtIndex:newIndex];
cell.label.text = [item objectForKey:@"label"];
cell.hidden = NO;
} else {
cell.hidden = YES;
}
return cell;
}
このメソッドを使用したい場合は、対応する項目を取得するためにdidSelectItemAtIndexPath
使用したのと同じ変換を使用する必要があります。cellForItemAtIndexPath
セルの余白がある場合は、行と列の計算にそれらを追加する必要があります。これが機能するには、それらが正しい必要があるためです。