子类化UICollectionView,跳过索引

时间:2014-05-14 08:59:44

标签: ios objective-c

我试图将集合视图布局子类化,以便在垂直单元格之间获得恒定的间距。我有2列和多行,动态单元格高度。 目标是Pinterest像网格一样。

所以我已经对布局类进行了子类化,现在在单元格之间有一个恒定的空间,但是由此造成了严重的问题。

当我向下滚动时,左边的单元格没有及时加载=有很多"孔"所以有3-4个细胞的空白区域,而且它们突然一下子突然出现。 所以我有这个:

1 2
3 4
  6
  8
当我向下滚动时,会出现<5>而不是5和7。我无法摆脱这个!

编辑:似乎当所有单元格大小相同时,就不会发生这种情况,所以当我在这里返回一个恒定高度时:

//cell size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
{
     CGSize size=CGSizeMake( imageWidth,  scale*height+[Globals sharedGlobals].gridViewStripHeight );
return size;

我的子类(当不使用它时,也解决了问题)

//the subclass
    - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
    {
        NSArray* arr = [super layoutAttributesForElementsInRect:rect];
        for (UICollectionViewLayoutAttributes* atts in arr)
        {
            if (nil == atts.representedElementKind)
            {
                NSIndexPath* ip = atts.indexPath;
                atts.frame = [self layoutAttributesForItemAtIndexPath:ip].frame;
            }
        }
        return arr;
    }

    - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        UICollectionViewLayoutAttributes* atts =[super layoutAttributesForItemAtIndexPath:indexPath];

         if (indexPath.item == 0 || indexPath.item == 1) // degenerate case 1, first item of section
             return atts;

        NSIndexPath* ipPrev =
        [NSIndexPath indexPathForItem:indexPath.item-2 inSection:indexPath.section];

        CGRect fPrev = [self layoutAttributesForItemAtIndexPath:ipPrev].frame;
        CGFloat rightPrev = fPrev.origin.y + fPrev.size.height + 50;
        if (atts.frame.origin.y <= rightPrev) // degenerate case 2, first item of line
            return atts;

        CGRect f = atts.frame;
        f.origin.y = rightPrev;
        atts.frame = f;
        return atts;
    }

使用它我有:

UICollectionViewFlowLayout *layout=[[TopAlignedCollectionViewFlowLayout alloc] init]; subclass
    CGRect  size=CGRectMake( ([UIScreen mainScreen].bounds.size.width-collectionWidth)/2,
                            upperLineMargin, collectionWidth, [UIScreen mainScreen].bounds.size.height-upperLineMargin);
    self.GridView=[[UICollectionView alloc] initWithFrame:size collectionViewLayout:layout];
    [self.GridView registerClass:[GridCell class] forCellWithReuseIdentifier:@"Cell"];

0 个答案:

没有答案