2013-05-21 73 views
0

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

- (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似乎会自我复制,并将其自身的另一个实例放置在顶部。我知道这听起来有些不可思议,但你可以看到它的外观如下图所示:

enter image description here

请注意,在滚动视图图像左侧是如何变黑了,我想这是因为滚动视图得到复制。

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

感谢您的帮助!

回答

0

每次调用collectionView: cellForItemAtIndexPath:时,新的UIImageView正被添加到重用单元中。要解决此问题,请在自定义UICollectionViewCell中实施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]; 
} 
+0

好吧,这个问题的是固定部分,它不重复,但现在我注意到另一个奇怪的问题。如果我通过在一个单元格的scrollViews中滑动来更改内容偏移量,则内容偏移量将传递到下一个单元格,并且前一个可能会获得新内容偏移量(即x = 0,y = 0)。 –

+0

这有点难以解释,因为我不太明白这种行为的原因,对不起:) –

+0

据我所知,每次添加新单元格时,整个collectionView都会更新。当单元格添加了scrollView时,会导致非常奇怪的结果。我在想,只有新的单元格被修改,但我看到所有单元格都被重用了 –