【问题标题】:How to get number of items from collectionview's data source如何从collectionview的数据源中获取项目数
【发布时间】:2014-02-15 08:41:31
【问题描述】:

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

@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;
}

【问题讨论】:

    标签: ios datasource uicollectionview uicollectionviewlayout


    【解决方案1】:

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

    [self.collectionView numberOfItemsInSection:0];
    

    如果您有多个部分,您可能需要遍历该部分以获取项目总数。

    同样可以得到节数:

    [self.collectionView numberOfSections];
    

    希望这会有所帮助! :)

    【讨论】:

    • 太棒了。非常感谢:)
    • 斯威夫特:collectionView.numberOfItems(inSection: 0)
    【解决方案2】:

    接下来是 Swifty 解决方案:

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

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

    【讨论】:

      【解决方案3】:

      如果你创建了一个名为 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++;
          }
      }
      

      【讨论】:

        【解决方案4】:

        在 Swift 中,您可以编写以下内容(前提是您有一个包含节和项的数据源):

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

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

        【讨论】:

          【解决方案5】:
          + (NSInteger)countInCollectionView:(UICollectionView *)collectionView {
             NSInteger itemCount = 0;
             for( int section = 0; section < [collectionView numberOfSections]; ++section ){
                itemCount += [collectionView numberOfItemsInSection:section];
             }
             return itemCount;
          }
          

          【讨论】:

            【解决方案6】:

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

            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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-21
              • 2011-11-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-08-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多