2015-06-12 3 views
1

В представлении коллекции мне бы хотелось узнать первый элемент, который отображается в виде коллекции. Я решил, что посмотрю на visibleCells и станет первым в списке, но это не так.Есть ли способ определить порядок self.collectionview.visiblecells?

+1

Вы хотите увидеть первый элемент в представлении коллекции или хотите увидеть первый элемент в видимых ячейках в виде коллекции? –

+0

Определите «первый». – Tommy

+0

Вы можете использовать метод "- (NSArray *) indexPathsForVisibleItems" для просмотра первого элемента, если в виде коллекции есть видимые ячейки. –

ответ

4

Возвратившись первый элемент виден на 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 

Edit: я верю в visibleCells (и тому подобное) возвращение заказал уже, но я не нашел ничего об этом на Docs. поэтому я добавил часть заказа, чтобы убедиться.

+0

Я просто попробовал это, но кажется, что у массива будет первый элемент в виде некоторого буфера. второй элемент - первый, который отображается. – Frank

+0

Это странно. попробуйте сделать это снова, но не прокрутите вниз по таблице/просто покажите первый элемент видимым, получите первый видимый элемент, а затем получите первую ячейку вручную (с помощью NSIndexPath), проверьте, совпадают ли они. Технически, этот код должен работать, я предлагаю вам отправить код :) – Erakk

+1

Я видел, что массив 'visibleCells' неупорядочен, поэтому это хорошая идея. – erikprice

0

В двухмерном пространстве нет ни одного возможного порядка. Если у self.collectionView.visibleCells нет вашего заказа, сортируйте ячейки так, как вы хотите, сравнивая их фреймы или их указательные пути.

2

Swift3

Основываясь на предыдущем ответе, здесь эквивалент Swift3, чтобы получить упорядоченный видимые ячейки, первый заказ видимый indexpath, то выборка UICollectionViewCell с использованием sorted и flatMap.

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) } 
0

Вот мой взгляд на него, добавить в качестве категории на 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 
Смежные вопросы