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的主要内容,如果未能解决你的问题,请参考以下文章