0

我在 UICollectionViewCell 中遇到了 UIScrollView 的奇怪行为。在我的项目中,我有一个 collectionView,每个单元格都有一个 UIScrollView,其中包含 1 个或多个图像。以下是用于此问题的一些示例代码:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

     CustomCollectionCell * cell = [cv dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath];
     UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 150, 150)];
     imageView.image = [UIImage imageNamed:@"someImage.png"];        
     [cell.scrollView addSubview:imageView];

     return cell;
}

当然,在我的项目中,它不是相同的图像,而是来自数据库的不同图像。

添加第一个收集单元没有问题。当我添加第二个单元格时,scrollView 似乎会复制自身并将其自身的另一个实例放在顶部。我知道这听起来很奇怪,但您可以在下图中看到它的外观:

在此处输入图像描述

请注意左侧滚动视图中的图像是如何变暗的,我认为这是因为滚动视图被复制了。

所以,我猜测该单元格以错误的方式或其他方式重复使用。

谢谢你的帮助!

4

1 回答 1

0

UIImageView每次collectionView: cellForItemAtIndexPath:调用时都会向重用单元添加一个新的。为了解决这个问题,在 customUICollectionViewCell中,实现该prepareForReuse方法。在该方法中,删除图像视图。

为此,您可以在图像视图上设置标签。例如,:

 (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

     CustomCollectionCell * cell = [cv dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath];
     UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 150, 150)];
     imageView.image = [UIImage imageNamed:@"someImage.png"];        
     [cell.scrollView addSubview:imageView];

     // The following line of code is new
     cell.contentView.tag = 100;

     return cell;
}

要从单元格中删除图像视图,请prepareForReuse在自定义单元格中添加/更新方法:

-(void)prepareForReuse{
    UIView *myImageView = [self.contentView viewWithTag:100];
    [myImageView removeFromSuperview];
}
于 2013-05-21T13:50:26.027 回答