UICollectionViewCell 和 UIScrollView

Posted

技术标签:

【中文标题】UICollectionViewCell 和 UIScrollView【英文标题】:UICollectionViewCell and UIScrollView 【发布时间】:2013-05-21 13:38:46 【问题描述】:

我在 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 似乎会复制自身并将其自身的另一个实例放在顶部。我知道这听起来很奇怪,但您可以在下图中看到它的外观:

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

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

感谢您的帮助!

【问题讨论】:

【参考方案1】:

每次调用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];

【讨论】:

好吧,问题的固定部分,它不会重复,但是现在我注意到另一个奇怪的问题。如果我通过在一个单元格的滚动视图中滑动来更改内容偏移量,则内容偏移量会传递到下一个单元格,而前一个单元格可能会获得新的内容偏移量(即 x=0,y=0)。 这有点难以解释,因为我不太明白这种行为的原因,抱歉:) 据我了解,每次添加新单元格时都会更新整个 collectionView。当单元格添加了滚动视图时,这会导致非常奇怪的结果。我以为只有新单元格被修改了,但我看到所有单元格都被重用了 @SergeyCatraniuc - 建议您接受上述答案 ;-),然后创建一个显示 UIScrollView 代码的新问题 我的问题没有得到完全回答,但是我想我会放弃 UIScrollView 并找到使用 UIImageView 的解决方法。感谢您的帮助

以上是关于UICollectionViewCell 和 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

具有动态高度的 UICollectionViewCell 使用 NSURL 进行图像下载

滚动时大型 UICollectionViewCell 停止显示

基于UILabel的UICollectionViewCell AutoLayout动态高度

如何确定何时显示 UICollectionViewCell?

XCTest 与自定义 UICollectionViewCell

将 UIViewController 添加到 UICollectionViewCell