如何从collectionview的数据源中获取项目数

时间:2014-01-24 11:14:51

标签: ios datasource uicollectionview uicollectionviewlayout

我是Collectionview的新手,但不是iOS的新手。我在我的collectionview中使用自定义Flowlayout。我需要根据CollectionView的数据源返回的当前项目数返回contentize。无论如何都知道flowlayout的集合视图中有多少项目?

@interface LatestNewsFlowLayout : UICollectionViewFlowLayout

-(id)initWithSize:(CGSize) size;

@end

@implementation LatestNewsFlowLayout

-(id)initWithSize:(CGSize) size {
    self = [super init];
    if (self) {
        self.itemSize = size;
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        self.sectionInset = UIEdgeInsetsMake(0, 10.0, 0, 0);
        self.minimumLineSpacing = 5;
    }
    return self;
}

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)oldBounds {
    return YES;
}

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *answer = [[super layoutAttributesForElementsInRect:rect] mutableCopy];

    for(int i = 1; i < [answer count]; ++i) {
        UICollectionViewLayoutAttributes *currentLayoutAttributes = answer[i];
        UICollectionViewLayoutAttributes *prevLayoutAttributes = answer[i - 1];
        NSInteger maximumSpacing = 5;
        NSInteger origin = CGRectGetMaxX(prevLayoutAttributes.frame);
        if(origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize.width) {
            CGRect frame = currentLayoutAttributes.frame;
            frame.origin.x = origin + maximumSpacing;
            currentLayoutAttributes.frame = frame;
        }
    }

    return answer;
}

-(CGSize) collectionViewContentSize
{
    CGSize size;
    int numOfItems = ???
    size.width = 100 * numOfItems;
    size.height = 100;
    return size;
}

6 个答案:

答案 0 :(得分:22)

UICollectionViewFlowLayout是UICollectionViewLayout的子类。因此它应该可以访问UICollectionView,它应该知道有多少项。

[self.collectionView numberOfItemsInSection:0];

如果你有一个以上的部分,你可能需要遍历该部分以获得项目总数。

您可以类似地获得部分的数量:

[self.collectionView numberOfSections];

希望这有帮助! :)

答案 1 :(得分:1)

如果你创建一个名为collectionView的属性/出口,请尝试:

for (int i = 0; i<[collectionView numberOfSections];i++) {//Iterate through all the sections in collectionView
    for (int j = 0; j<[collectionView numberOfItemsInSection:i]; j++) {//Iterate through all the rows in each section
        numOfItems++;
    }
}

答案 2 :(得分:1)

在Swift中,您可以编写以下内容(假设您有包含节和项目的数据源):

let totalItemCount = sections.reduce(0) { result, section -> Int in
   return result + section.items.count
}

只需将section替换为您的数据源,将items替换为项目集合名称。

答案 3 :(得分:0)

+ (NSInteger)countInCollectionView:(UICollectionView *)collectionView {
   NSInteger itemCount = 0;
   for( int section = 0; section < [collectionView numberOfSections]; ++section ){
      itemCount += [collectionView numberOfItemsInSection:section];
   }
   return itemCount;
}

答案 4 :(得分:0)

下一个快速解决方案:

let itemsCount = Array(0..<collectionView.numberOfSections)
    .map { collectionView.numberOfItems(inSection: $0) }
    .reduce(0, +)

现在itemsCount包含所有部分中集合视图项的总数。

答案 5 :(得分:0)

我喜欢 Vadim's answer 因为它快速而干净,但我们正在从一个范围创建一个数组并循环它两次(映射和缩减)。我建议直接使用只有一个循环的范围(减少)的类似解决方案:

let totalItems = (0..<collectionView.numberOfSections)
  .reduce(0) { res, cur in
    res + collectionView.numberOfItems(inSection: cur)
  }

就我而言,我最终为 UICollectionView 创建了一个扩展:

extension UICollectionView {
  var totalItems: Int {
    (0..<numberOfSections).reduce(0) { res, cur in
      res + numberOfItems(inSection: cur)
    }
  }
}

然后就是:

collectionView.totalItems