滚动时UICollectionViewCell重叠

时间:2014-05-14 07:09:03

标签: ios user-interface

以下代码是一个非常简单的程序,用于显示UICollectionView中1-10000的数字。它正确显示而不滚动,但如果向下滚动并向后滚动集合视图,则单元格会重叠。

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return 10000;
}
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
    return CGSizeMake(100,30);
}
-(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    NSString *identifier = @"cell_id";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
    [label setText:[NSString stringWithFormat:@"%d", indexPath.item, nil]];
    [cell.contentView addSubview:label];

    return cell;
}

3 个答案:

答案 0 :(得分:3)

这里的问题是标签被重复添加到视图的单元格中。重复使用单元格时不会删除旧标签,因此您会看到多个数字重叠。解决方案可以是删除像这样的旧标签

for (UIView *view in cell.contentView.subviews) {
        if ([view isKindOfClass:[UILabel class]]) {
            [view removeFromSuperview];
        }
    }
在添加到单元格之前

。但是,当子视图的数量增加时,这将产生性能问题。您可以使用标签创建自定义单元格,然后更新其值。我没有尝试过,但我相信它会起作用。希望这有帮助

答案 1 :(得分:2)

这在Swift 3中对我有用: 与批准的解决方案几乎相同的解决方案,请注意我使用

cell.subViews 

而不是

cell.contentView.subViews

对我有用的是:

for view in cell.subviews {
  view.removeFromSuperview()
}

答案 2 :(得分:0)

将单元格层anchorPointZ设置为cellForItemAtIndexPath:方法中的行索引

cell.layer.anchorPointZ = CGFloat(indexPath.row)