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 中重用单元格 - Swift
使用 SDWebImage 为 UICollectionView 可重用单元从路径加载图像 - Swift
制作 iOS Gallery - UICollectionView 可重用性
重用 UICollectionView 中的单元格时,会短暂显示重用 UICollectionViewCell 的旧内容