滚动UICollectionView时图像会发生变化

时间:2016-05-17 07:44:24

标签: ios objective-c uicollectionview

我使用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;
}

我面临的问题是,

  1. 如果我正在水平滚动
  2. ,图像内容会发生变化
  3. 圆形边框正在渲染到collectionview的每个单元格,但圆形边框没有渲染到整个UICollectionView。
  4. 我该如何解决这个问题?

4 个答案:

答案 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.这意味着您将获得不可预测的结果,这就是您的图像不断变化的原因。