collectionView可重用的单元格导致错误

时间:2015-05-01 09:31:00

标签: ios objective-c uicollectionview uicollectionviewcell

我正在创建一个collectionView,其单元格大小不同,内容也不同。我正在为这些单元格使用单元格原型,但是,当我添加多个单元格时,我会得到奇怪的UI错误:

这应该是它的样子 Supposed to 这就是它实际上的样子 Fail

代码:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    Card *card = [[[usermanager getSelectedUser] getCards] objectAtIndex:indexPath.item];

    [card setupLayout];

    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    if(cell == nil){
        cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cardCell" forIndexPath:indexPath];
    }
    [cell addSubview:card];
    cell.clipsToBounds = YES;
    cell.layer.shouldRasterize = YES;
    cell.layer.rasterizationScale = [UIScreen mainScreen].scale;

    cell.layer.shadowPath = [[UIBezierPath bezierPathWithRect:cell.bounds] CGPath];

    //Add dropshadow
    cell.contentView.layer.borderWidth = 1.0f;
    cell.contentView.layer.borderColor = [UIColor clearColor].CGColor;
    cell.contentView.layer.masksToBounds = YES;

    cell.layer.shadowColor = [UIColor blackColor].CGColor;
    cell.layer.shadowOffset = CGSizeMake(0, 5.0f);
    cell.layer.shadowRadius = 2.0f;
    cell.layer.shadowOpacity = 0.5f;
    cell.layer.masksToBounds = NO;

    cell.layer.borderColor = [UIColor yellowColor].CGColor;
    cell.layer.borderWidth = 2.0f;

    return cell;
}

它可能与我使用可重复使用的细胞这一事实有关。因为当我在故事板中为这些单元创建2个不同的原型时,它们完全没有问题。谁能帮我?感谢

1 个答案:

答案 0 :(得分:4)

如你所说:你的单元格将被重用,所以如果你改变任何布局或框架或颜色,这些属性就像你下次使用单元格时设置的那样。你应该子类化UICollectionViewCell并实现方法prepareForReuse,你必须将单元格的所有视图和属性重置为原始值,你必须删除子视图卡:

-(void)prepareForReuse {
    [super prepareForReuse];
    // Reset all, for example backgroundView
    self.backgroundView = nil;
}

还有一点:为什么你打电话UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];这不正确。您只需要UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cardCell" forIndexPath:indexPath];