UICollectionView:如何将一个部分的项目保存在一行中?

时间:2015-04-07 19:18:26

标签: ios uicollectionview

我想在UICollectionView内有三个部分。 每个部分应在同一行显示其项目。如果这些项目不适合屏幕,它们仍应保持在同一行,用户应向右滚动以查看它们。

简而言之,我想阻止项flow进入下一行。希望它有意义。

我找到了一些奇怪的解决方案here。但如果你有多个部分,这些并不真正有用。

我该如何解决这个问题? Storyboard上有设置还是我必须使用自定义布局?

2 个答案:

答案 0 :(得分:0)

使用多个UICollectionViews,每个都有自己的可滚动区域。

答案 1 :(得分:0)

我刚才写了这个布局,但我认为它应该仍然有效。数据源是一个数组数组,因此每一行都是一个新的部分。这是流程布局类,

#define space 5
#import "MultpleLineLayout.h"

@implementation MultpleLineLayout { // a subclass of UICollectionViewFlowLayout
    NSInteger itemWidth;
    NSInteger itemHeight;
}

-(id)init {
    if (self = [super init]) {
        itemWidth = 60;
        itemHeight = 60;
    }
    return self;
}

-(CGSize)collectionViewContentSize {
    NSInteger xSize = [self.collectionView numberOfItemsInSection:0] * (itemWidth + space); // "space" is for spacing between cells.
    NSInteger ySize = [self.collectionView numberOfSections] * (itemHeight + space);
    return CGSizeMake(xSize, ySize);
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)path {
    UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:path];
    attributes.size = CGSizeMake(itemWidth,itemHeight);
    long xValue = itemWidth/2 + path.row * (itemWidth + space);
    long yValue = itemHeight + path.section * (itemHeight + space);
    attributes.center = CGPointMake(xValue, yValue);
    return attributes;
}


-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
    NSInteger minRow =  (rect.origin.x > 0)?  rect.origin.x/(itemWidth + space) : 0; // need to check because bounce gives negative values  for x.
    NSInteger maxRow = rect.size.width/(itemWidth + space) + minRow;
    NSMutableArray* attributes = [NSMutableArray array];
    for(NSInteger i=0 ; i < self.collectionView.numberOfSections; i++) {
        for (NSInteger j=minRow ; j < maxRow; j++) {
            NSIndexPath* indexPath = [NSIndexPath indexPathForItem:j inSection:i];
            [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
        }
    }
    return attributes;
}