我使用UICollectionView加载图片。
以下是我的代码。 ImageArray将包含每个必须加载的图像的URL。在我的代码中,我试图在整个集合视图周围给出一个圆形边框
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"Cell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
CALayer* layer = cell.layer;
[layer setCornerRadius:4.0f];
[layer setBorderColor:[UIColor colorWithWhite:0.8 alpha:1].CGColor];
[layer setBorderWidth:1.0f];
if ([ImageArray count] >0){
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {
NSData *data0 = [NSData dataWithContentsOfURL: [NSURL URLWithString:[ImageArray objectAtIndex:indexPath.row]]];
UIImage *image = [UIImage imageWithData: data0];
dispatch_sync(dispatch_get_main_queue(), ^(void) {
recipeImageView.image = image;
});
});
}
[spinnerShow stopAnimating];
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
return cell;
}
我面临的问题是,
我该如何解决这个问题?
答案 0 :(得分:2)
UICollectionView
将重用现有单元格。因此,imageView
中的collectionViewCell
可能会显示之前加载的图片。
它不是一个完美的解决方案,但尝试将nil
或默认图片传递给imageView
,然后再开始下载
recipeImageView.image = nil;
前
if ([ImageArray count] > 0) {
答案 1 :(得分:2)
UICollectionViewCell
中的是一种方法prepareForReuse
,您应该覆盖该方法并将UIImageView
的图像设置为nil
答案 2 :(得分:1)
您可以将边框和圆角半径设置为集合视图,例如
collectionView.layer.borderWidth = 1.0;
collectionView.layer.backgroundColor = [UIColor colorWithWhite:0.8 alpha:1].CGColor;
collectionView.layer.cornerRadius = 4.0f;
并且不要在cellForItemAtIndexPath
中设置它。将其设置为viewdidload
,以便加载一次,否则每次单元格将变为deque时都会设置它!
第二件事,正如一条评论中的建议,您应该使用SDWebImage来缓存图像。
如果您使用自动布局,请确保设置正确的约束。
希望这会有所帮助:)
答案 3 :(得分:1)
您正在引用单元格的标记,但所有单元格都具有相同的标记值100.这意味着您将获得不可预测的结果,这就是您的图像不断变化的原因。