在集合视图中,我想知道在集合视图中显示的第一个项目。我想我会看看visibleCells,这将是列表中的第一个项目,但事实并非如此。
答案 0 :(得分:8)
返回collectionView上可见的第一个项目:
UICollectionViewCell *cell = [self.collectionView.visibleCells firstObject];
从collectionView
中的所有项目返回第一项UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];
您不需要单元格,只需要数据:
NSIndexPath *indexPath = [[self.collectionView indexPathsForVisibleItems] firstObject];
id yourData = self.dataSource[indexPath.row];
但是没有订购visivleCells数组!!
那么你需要订购它:
NSArray *indexPaths = [self.collectionView indexPathsForVisibleItems];
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"row" ascending:YES];
NSArray *orderedIndexPaths = [indexPaths sortedArrayUsingDescriptors:@[sort]];
// orderedIndexPaths[0] would return the position of the first cell.
// you can get a cell with it or the data from your dataSource by accessing .row
编辑:我确实相信visibleCells(等)已经返回已订购,但我在文档上找不到任何相关内容。所以我添加了订购部分以确保。
答案 1 :(得分:6)
<强> Swift3 强>
根据之前的回答,这里是Swift3等效于获取有序可见单元格,首先对可见索引路径进行排序,然后使用sorted
和flatMap
获取UICollectionViewCell。
let visibleCells = self.collectionView.indexPathsForVisibleItems
.sorted { left, right -> Bool in
return left.section < right.section || left.row < right.row
}.flatMap { indexPath -> UICollectionViewCell? in
return self.collectionView.cellForItem(at: indexPath)
}
在更简化的版本中,可读性稍差
let visibleCells = self.collectionView.indexPathsForVisibleItems
.sorted { $0.section < $1.section || $0.row < $1.row }
.flatMap { self.collectionView.cellForItem(at: $0) }
答案 2 :(得分:1)
以下是我的观点,在UICollectionViewCell
上添加为类别。
@implementation UICollectionView (LTSortedCells)
-(NSArray<UICollectionViewCell*>*)LT_visibleCellsSortedByIndexPath
{
NSMutableDictionary<NSIndexPath*,UICollectionViewCell*>* dict = [NSMutableDictionary dictionary];
NSArray<NSIndexPath*>* indexPaths = self.indexPathsForVisibleItems;
NSArray<UICollectionViewCell*>* cells = self.visibleCells;
[indexPaths enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull indexPath, NSUInteger idx, BOOL * _Nonnull stop) {
UICollectionViewCell* cellForIndexPath = [cells objectAtIndex:idx];
[dict setObject:cellForIndexPath forKey:indexPath];
}];
NSArray<NSIndexPath*>* sortedIndexPaths = [indexPaths sortedArrayUsingComparator:^NSComparisonResult(NSIndexPath* _Nonnull ip1, NSIndexPath* _Nonnull ip2) {
return [ip1 compare:ip2];
}];
NSMutableArray<UICollectionViewCell*>* sortedCells = [NSMutableArray array];
[sortedIndexPaths enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull indexPath, NSUInteger idx, BOOL * _Nonnull stop) {
UICollectionViewCell* cellForIndexPath = [dict objectForKey:indexPath];
[sortedCells addObject:cellForIndexPath];
}];
return [NSArray arrayWithArray:sortedCells];
}
@end
答案 3 :(得分:0)
在二维空间中,没有一个可能的顺序。如果self.collectionView.visibleCells
没有您希望的订单,请按照您希望的方式对单元格进行排序,方法是比较它们的框架或索引路径。