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

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

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

捕捉滚动动作:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
{
     [self reload];   
}

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

【问题讨论】:

    标签: ios objective-c xcode scroll uicollectionview


    【解决方案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:时可以开始加载图片,在开始下载请求之前必须检查该图片是否正在下载,否则会多次加载。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多