当我滚动它时,图像在 collectionView 中发生变化
Images are changing in collectionView when i scroll it
在下面的代码中,collectionView 会平滑滚动,但有时如果我滚动得非常快,会显示不正确的图像,然后随着滚动减速而更改为正确的图像。为什么不设置
下面是我正在使用的代码
我的代码:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell;
cell= [collectionView dequeueReusableCellWithReuseIdentifier:@"identifier" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
NSMutableArray *arr_assect=[menuArray objectAtIndex:indexPath.row];
backView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, cell.bounds.size.height)];
UIImageView *dotlines=[[UIImageView alloc]init];
dotlines.frame=CGRectMake(1, 0, cell.bounds.size.width-1, cell.bounds.size.height);
dotlines.image=[UIImage imageNamed:@"dottedline"];
[cell addSubview:dotlines];
UIImageView*cellImage=[[UIImageView alloc]initWithFrame:CGRectMake(18, 10,backView.bounds.size.height-35, backView.bounds.size.height-40)];
NSLog(@"arrayimage%@",[[menuArray valueForKey:@"category_image"] objectAtIndex:indexPath.row]);
NSString *str_homepage = [NSString stringWithFormat:@"%@",[[menuArray valueForKey:@"home_page"] objectAtIndex:indexPath.row]];
NSLog(@"str_home_page%@",str_homepage);
NSString *imageUrl= [arr_assect valueForKey:@"category_image"];
if ([[ImageCache sharedImageCache] DoesExist:imageUrl]) {
cellImage.image=[UIImage imageWithData:[[ImageCache sharedImageCache] GetImage:imageUrl]];
}
else{
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSData *imageData=[NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
dispatch_async(dispatch_get_main_queue(), ^{
cellImage.image=[UIImage imageWithData:imageData];
});
[[ImageCache sharedImageCache] AddImage:imageUrl withData:imageData];
});
}
UILabel *lblCategoryTitle =(UILabel *) [cell viewWithTag:5];
if (!lblCategoryTitle) {
lblCategoryTitle=[[UILabel alloc]init];
[cell.contentView addSubview:lblCategoryTitle];
}
[lblCategoryTitle setFont: [UIFont fontWithName:@"helvetica" size:10]];
lblCategoryTitle.tag=5;
lblCategoryTitle.textAlignment = NSTextAlignmentCenter;
lblCategoryTitle.frame=CGRectMake(backView.frame.origin.x, cellImage.frame.origin.y+cellImage.frame.size.height+0,cell.frame.size.width , 25);
lblCategoryTitle.textColor = [UIColor blackColor];
lblCategoryTitle.backgroundColor = [UIColor clearColor];
lblCategoryTitle.numberOfLines = 2;
NSString *abc = [arr_assect valueForKey:@"categoryNm"];
abc = [NSString stringWithFormat:@"%@%@",[[abc substringToIndex:1] uppercaseString],[abc substringFromIndex:1] ];
NSLog(@"abc = %@",abc);
if (APP_SHARE.language_int == 0) {
lblCategoryTitle.text =abc;
}
else if (APP_SHARE.language_int == 2)
{
lblCategoryTitle.text =[arr_assect valueForKey:@"categoryNmBl"];
}
[cell addSubview:cellImage];
[cell.contentView addSubview:backView];
return cell;
}
为了解决这个问题,您应该准备好您的电池以供重复使用。 UICollectionViewCell 和 UITableViewCell 上有一个名为 prepareForReuse 的方法。如果您在重复使用单元格之前不清除内容,那么您可能会看到前一个单元格的内容。
如果您只使用 labels/textviews 并且您的内容已准备好设置,则不会有影响。但是,如果您使用背景图像加载 (如您的示例) 或任何其他后台任务,那么它肯定会影响您。
下面是一个实现示例:
- (void)prepareForReuse {
_titleLabel.text = nil;
_avatarImageView.image = nil;
[super prepareForReuse];
}
在下面的代码中,collectionView 会平滑滚动,但有时如果我滚动得非常快,会显示不正确的图像,然后随着滚动减速而更改为正确的图像。为什么不设置 下面是我正在使用的代码 我的代码:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell;
cell= [collectionView dequeueReusableCellWithReuseIdentifier:@"identifier" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
NSMutableArray *arr_assect=[menuArray objectAtIndex:indexPath.row];
backView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, cell.bounds.size.height)];
UIImageView *dotlines=[[UIImageView alloc]init];
dotlines.frame=CGRectMake(1, 0, cell.bounds.size.width-1, cell.bounds.size.height);
dotlines.image=[UIImage imageNamed:@"dottedline"];
[cell addSubview:dotlines];
UIImageView*cellImage=[[UIImageView alloc]initWithFrame:CGRectMake(18, 10,backView.bounds.size.height-35, backView.bounds.size.height-40)];
NSLog(@"arrayimage%@",[[menuArray valueForKey:@"category_image"] objectAtIndex:indexPath.row]);
NSString *str_homepage = [NSString stringWithFormat:@"%@",[[menuArray valueForKey:@"home_page"] objectAtIndex:indexPath.row]];
NSLog(@"str_home_page%@",str_homepage);
NSString *imageUrl= [arr_assect valueForKey:@"category_image"];
if ([[ImageCache sharedImageCache] DoesExist:imageUrl]) {
cellImage.image=[UIImage imageWithData:[[ImageCache sharedImageCache] GetImage:imageUrl]];
}
else{
dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSData *imageData=[NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
dispatch_async(dispatch_get_main_queue(), ^{
cellImage.image=[UIImage imageWithData:imageData];
});
[[ImageCache sharedImageCache] AddImage:imageUrl withData:imageData];
});
}
UILabel *lblCategoryTitle =(UILabel *) [cell viewWithTag:5];
if (!lblCategoryTitle) {
lblCategoryTitle=[[UILabel alloc]init];
[cell.contentView addSubview:lblCategoryTitle];
}
[lblCategoryTitle setFont: [UIFont fontWithName:@"helvetica" size:10]];
lblCategoryTitle.tag=5;
lblCategoryTitle.textAlignment = NSTextAlignmentCenter;
lblCategoryTitle.frame=CGRectMake(backView.frame.origin.x, cellImage.frame.origin.y+cellImage.frame.size.height+0,cell.frame.size.width , 25);
lblCategoryTitle.textColor = [UIColor blackColor];
lblCategoryTitle.backgroundColor = [UIColor clearColor];
lblCategoryTitle.numberOfLines = 2;
NSString *abc = [arr_assect valueForKey:@"categoryNm"];
abc = [NSString stringWithFormat:@"%@%@",[[abc substringToIndex:1] uppercaseString],[abc substringFromIndex:1] ];
NSLog(@"abc = %@",abc);
if (APP_SHARE.language_int == 0) {
lblCategoryTitle.text =abc;
}
else if (APP_SHARE.language_int == 2)
{
lblCategoryTitle.text =[arr_assect valueForKey:@"categoryNmBl"];
}
[cell addSubview:cellImage];
[cell.contentView addSubview:backView];
return cell;
}
为了解决这个问题,您应该准备好您的电池以供重复使用。 UICollectionViewCell 和 UITableViewCell 上有一个名为 prepareForReuse 的方法。如果您在重复使用单元格之前不清除内容,那么您可能会看到前一个单元格的内容。
如果您只使用 labels/textviews 并且您的内容已准备好设置,则不会有影响。但是,如果您使用背景图像加载 (如您的示例) 或任何其他后台任务,那么它肯定会影响您。
下面是一个实现示例:
- (void)prepareForReuse {
_titleLabel.text = nil;
_avatarImageView.image = nil;
[super prepareForReuse];
}