UICollectionViewFlowLayout没有正确断行

时间:2014-01-07 20:35:15

标签: ios uikit uicollectionview

我已经将子流布局子类化,并在我的集合视图中将其设置为我的collectionViewLayout

然后我按如下方式设置布局:

- (id) init
{
    if(self = [super init])
    {
        self.minimumInteritemSpacing = 11.0;
        self.scrollDirection = UICollectionViewScrollDirectionVertical;
        self.itemSize = CGSizeMake(64.0,32.0);
        self.minimumLineSpacing = 10.0;
        self.sectionInset = UIEdgeInsetsMake(11.0,95.0,11.0,11.0);

        return self;
    }
    return nil;
}

95 + 64 + 11 + 64 + 11 + 64 + 11 = 320 - 我查了一下。 (那是一个留下的插图,3个单元格,2个空格和一个右边插图)

我有1个部分,72个项目,以及索引路径功能的单元格:

- (UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CustomCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifierForCustomCell forIndexPath:indexPath];

    cell.mainLabel.text = [@(indexPath.item) stringValue];

    return cell;
}

输出是这样的:

screenshot

如您所见,每行只有2个单元格。此外,它不会显示每个第3个单元格。

我看了一下流布局的布局函数是什么产生的

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {

...给出 console output

这是layoutAttributes [NSArray]中的前3个布局属性,你可以看到它已经决定只将前2个然后第4个项目视为rect(320 by 568)可见。这必须是集合视图布局中的错误,不是吗?集合视图填充屏幕,宽320。因此,由于这是一个换行符布局,因此屏幕上不应有任何项目。

删除了边缘插图:

screenshot 2

它按预期工作。但是我想要部分插入,因为我需要添加一些需要在同一个滚动视图中的装饰视图,而我需要比右插入更大的lleft插入。

2 个答案:

答案 0 :(得分:1)

Apple的UICollectionViewFlowLayout中存在一个错误,其中一些单元格显示超出范围。 这些资源将帮助您修复它(您必须创建UICollectionViewFlowLayout的子类并覆盖此方法):

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
    NSMutableArray *newAttributes = [NSMutableArray arrayWithCapacity:attributes.count];
    for (UICollectionViewLayoutAttributes *attribute in attributes) {
        if ((attribute.representedElementCategory != UICollectionElementCategoryCell) || // always include everything that's not a cell
            ((attribute.frame.origin.x + attribute.frame.size.width <= (self.collectionViewContentSize.width - self.sectionInset.right)) &&
             (attribute.frame.origin.y + attribute.frame.size.height <= (self.collectionViewContentSize.height - self.sectionInset.bottom))))
        {
            [newAttributes addObject:attribute];
        }
    }
    return newAttributes;
}

此修复的基础来源:

答案 1 :(得分:1)

直到有人知道最新情况以及这是否是一个错误,我目前使用的解决方法是:

- (NSArray *)alterAttributes:(NSArray *)attributes
{
    for (UICollectionViewLayoutAttributes *attribute in attributes) {

        switch (attribute.indexPath.item % 3) {
            case 0:
                attribute.center = CGPointMake(CellX1,attribute.center.y);
                break;
            case 1:
                attribute.center = CGPointMake(CellX2,attribute.center.y);
                break;
            case 2:
                attribute.center = CGPointMake(CellX3,attribute.center.y);
                break;

            default:
                break;
        }
    }
    return attributes;
}

手动更改layoutAttributesForElementsInRect中的x坐标 - 并非真正令人满意的解决方案。