uicollectionview 可重用单元格图像在滚动时加载

Posted

技术标签:

【中文标题】uicollectionview 可重用单元格图像在滚动时加载【英文标题】:uicollection view reusable cell images are reloading while scrolling 【发布时间】:2013-09-12 13:31:51 【问题描述】:

您好,我正在使用 UICollectionView 在我的 iphone 应用程序中显示图像,但是当我滚动视图时,加载的图像消失并再次加载图像,这是因为“dequeueReusableCellWithReuseIdentifier” 这是我的代码

static NSString * const kCellReuseIdentifier = @"collectionViewCell";
[self.collectionViewPack registerNib:[UINib nibWithNibName:@"CollectionViewItem" bundle:nil] forCellWithReuseIdentifier:kCellReuseIdentifier];

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

        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kCellReuseIdentifier forIndexPath:indexPath];

        cell.layer.shouldRasterize = YES;
        cell.layer.rasterizationScale = [UIScreen mainScreen].scale;

        UILabel *titleLabel = (UILabel *)[cell viewWithTag:100];
        UIImageView *icon=(UIImageView *)[cell viewWithTag:101];
        //    [titleLabel setText:[NSString stringWithFormat:@"%d",indexPath.row]];
        [titleLabel setText:[NSString stringWithFormat:@"%@",[arrayImages objectAtIndex:indexPath.row]]];
        icon.image =[UIImage imageNamed:@"loading-1.png"];


        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
            NSString *imagePath = [NSString stringWithFormat:@"%@", [test.arrImages objectAtIndex:indexPath.row]];
            NSURL *imageUrl     = [NSURL URLWithString:imagePath];
            NSData *imageData   = [NSData dataWithContentsOfURL:imageUrl];
            UIImage *image      = nil;
            if (imageData)

                image = [[UIImage alloc] initWithData:imageData];
                icon.image = image;

            

            [image release];

        );



        return cell;


    

请帮帮我。

【问题讨论】:

检查this answer。它适用于UITableViewCell 延迟加载图像,但同样适用于UICollectionViewCell 【参考方案1】:

我猜你需要在你的代码中添加一些图像缓存,我建议你使用AFNetworking, 你可以轻松做到:

import "UIImageView+AFNetworking.h"

......

[cell.imageView setImageWithURL:imageUrl placeholderImage:[UIImage imageNamed:@"default"]];

而且,它有一个内部缓存可以帮助:D

对于您的代码...尝试将其添加到您的块中

dispatch_async(dispatch_get_main_queue(), ^
    icon.image = image;
);

【讨论】:

你应该避免使用dispatch_async 来修复你的代码中的问题,除非你正在处理一个Apple bug。通常,这会引入技术债务和不必要的复杂性。【参考方案2】:

kCellReuseIdentifier 更改为dynamic

static NSString * const kCellReuseIdentifier = @"collectionViewCell";

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

    NSString * kCellReuseIdentifier = 
      [NSString stringWithFormat:@"collectionViewCell%d",indexPath.row];

它可能会起作用

【讨论】:

【参考方案3】:
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
                 cellForItemAtIndexPath:(NSIndexPath *)indexPath 

    // Setup cell identifier
    static NSString *cellIdentifier = @"put you viewController here";

    /* this block to use nib-based cells */
     UICollectionViewCell *cell = 
      [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier 
                                                  forIndexPath:indexPath];
    /* end of nib-based cell block */

    /* this block to use subclass-based cells */
  yourviewController *cell = 
  (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier 
                                                      forIndexPath:indexPath];

【讨论】:

以上是关于uicollectionview 可重用单元格图像在滚动时加载的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 不重用单元格

如何不在 UICollectionView 中重用单元格 - Swift

使用 SDWebImage 为 UICollectionView 可重用单元从路径加载图像 - Swift

制作 iOS Gallery - UICollectionView 可重用性

重用 UICollectionView 中的单元格时,会短暂显示重用 UICollectionViewCell 的旧内容

UICollectionView 不重用单元格