IOS Objc如何在滚动后正确加载UICollectionViewCell

Posted

技术标签:

【中文标题】IOS Objc如何在滚动后正确加载UICollectionViewCell【英文标题】:IOS Objc how to properly load UICollectionViewCell after Scrolling 【发布时间】:2015-08-20 10:10:52 【问题描述】:

我是 obj/Xcode 的新手,我需要做一个 UIcollectionView 如何从 url 请求中获取图像。 我尝试使用scrollViewDidScroll 捕获滚动事件,然后使用参数page + 1 或-1 调用我的请求函数;取决于滚动。

但是每次我进行无限循环,并且我的单元格图像停止加载时,我认为这是因为我的方式是错误的:

捕捉滚动动作:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

     [self reload];   

函数 reload 发送请求并设置 imgs。 我怎样才能正确加载页面,而不是每次滚动 1000 次。 对不起我的英语,谢谢你

【问题讨论】:

【参考方案1】:

你不需要像那样调用 reload。当您滚动时,会自动调用“cellForItemAtIndexPath”。如果表格中有一个以前使用过的单元格(不在视图中),那么该单元格将被重新用于它正在填充的新位置 - 因此是“dequeueReusableCellWithReuseIdentifier”(希望你正在使用它?!)。

所以您需要做的是在该方法本身上编写代码,它会自动“延迟加载”您想要的图像。下面是实现此目的的 cellForItemOfIndexPath 方法的副本 - 图像在下载时被填充。

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

VideoSearchCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

YoutubeSearchResult *cellSearchResult = [self.ytSearchResults objectAtIndex:indexPath.row];

if (cellSearchResult.thumbnailImage.image == nil)

    //NSLog(@"loading image");
    __weak VideoSearchCell *weakCell = cell;
    __weak YoutubeSearchResult *weakResult = cellSearchResult;
    NSURL *url = [NSURL URLWithString:cellSearchResult.thumbUrl];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    UIImage *placeholderImage = [UIImage imageNamed:@"your_placeholder"];
    [cellSearchResult.thumbnailImage setImageWithURLRequest:request placeholderImage:placeholderImage success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
     
         weakResult.thumbnailImage.image = image;
         weakCell.imageView.image = image;
         [weakCell setNeedsLayout];
      failure:nil];

 else 
    if (cell.imageView.image != cellSearchResult.thumbnailImage.image)
    
        cell.imageView.image = cellSearchResult.thumbnailImage.image;
    

return cell;

所以解释一下 - VideoSearchCell 是我的自定义单元格类型。它相当简单,它上面只有一个 UIImageView,称为“imageView”。我还有一个名为“ytSearchResults”的数组——它包含一个对象数组,有些包含图像,有些不包含。随着图像的下载,结果也会填充到该数组中,因此我不会下载过多的图像。

代码检查该数组中是否有图像。如果没有,它会执行下载代码。

顺便说一句,我使用 __weak 对属性的引用,因为 ARC 并且不想意外保留单元格或搜索结果。没有足够的时间在这里解释所有这些!希望代码有所帮助。

还有一件事 - setImageWithURLRequest 是来自非常方便且非常流行的库 AFNetworking (2.0) 的一种方法。掌握它,因为您将一直使用它。

【讨论】:

答案比你快很多,卢克,我会试试的。 :)【参考方案2】:

我不建议在实际使用单元格之前加载图像,因为您永远不知道用户是否会看到该单元格。调用 - collectionView:cellForItemAtIndexPath:时可以开始加载图片,在开始下载请求之前必须检查该图片是否正在下载,否则会多次加载。

【讨论】:

以上是关于IOS Objc如何在滚动后正确加载UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章

iOS中NSRunloop与滚动视图时停止加载的问题

为啥通过 AJAX 无限滚动加载的内容的高度在加载后没有正确测量?

如何在iOS swift中水平滚动图像

使用objc runtime实现iOS懒加载

加载ios后如何扩大视图宽度

iOS进阶 - App启动优化