我是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;
}
答案 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