有没有办法确定self.collectionview.visiblecells的顺序?

时间:2015-06-12 20:03:06

标签: ios

在集合视图中,我想知道在集合视图中显示的第一个项目。我想我会看看visibleCells,这将是列表中的第一个项目,但事实并非如此。

4 个答案:

答案 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等效于获取有序可见单元格,首先对可见索引路径进行排序,然后使用sortedflatMap获取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没有您希望的订单,请按照您希望的方式对单元格进行排序,方法是比较它们的框架或索引路径。