ios 7 - 异步图像下载UITableView用于具有未知维度的图像

时间:2015-06-01 14:23:03

标签: ios image uitableview asynchronous afnetworking

我正在使用针对iOS 7的XCode 6.3.1。

我正在使用AFNetworking的{​​{1}}类别将未知维度的图片下载到UIImageView。这是一个示例图像:

enter image description here

我遇到的问题是,由于图像的尺寸未知,我只使用占位符图像。如果占位符图像具有完全相同的尺寸,则没有问题。但是,如果尺寸不同,则单元格中存在间距问题。

如果图像小于间距太大。这是一个例子:

enter image description here

我不知道如何在完成下载图像后刷新单元格,以便间距符合UITableViewCell

如果我滚动离开单元格并向后滚动,则间距很好。

以下是一些下载图像的示例代码

Auto Layout Constraints

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Temp static NSString *Cell = @"CustomListCell"; CustomListCell *cell = (CustomListCell *)[self.tableView dequeueReusableCellWithIdentifier:Cell]; CustomListRow *customListRow = self.customList.rows[indexPath.row]; // Reset the cell cell.headerImageView.image = nil; cell.titleLabel.text = @""; // Download the image, placeholder image is necessary NSString *topImageURL = @"sample_image"; __weak __typeof(cell)weakCell = cell; if ([topImageURL isEqualToString:@""] || [topImageURL isEqualToString:@"false"]) { // Do nothing } else { [cell.headerImageView setImageWithName:topImageURL afterManipulation:^UIImage *(UIImage *image) { // Manipulation UIImage *newImage = [UIImage expandImage:image toWidth:Constants.screenWidth - 16]; // CustomListCell *updateCell = (CustomListCell *)[tableView cellForRowAtIndexPath:indexPath]; // if (updateCell) // updateCell.headerImageView.image = newImage; return newImage; } placeholderImage:[UIImage expandImage:Constants.placeholderImage toWidth:Constants.screenWidth - 26]]; } return cell; } 是我绕过setImageWithName:afterManipulation:placeholderImage: AFNetworking的方法....它首先检查图像是否存在于本地,然后再检查两个不同的URL(absolute和base_url +相对)如果图像存在那里。

我将操作块放在那里,以便我可以调用我创建的setImageWithURL类别方法,该方法将缩放图像以适合UIImage的宽度(因此唯一的动态部分是高度)。

以下是我尝试的一系列事项:

  • 重新加载特定单元格
  • 重新加载整个表格
  • UITableView
  • 致电[self.tableView beginUpdates] + [self.tableView endUpdates];[cell setNeedsLayout]
加载图像后,

[cell setNeedsDiplay];setNeedsLayout没有做任何事情(我将它放在afterManipulation块中,在分配图像之前调用它,我也尝试过它图像已分配。)

重新加载单元格,表格或beginUpdates会导致一些非常奇怪的行为发生。细胞开始混合在一起,一些细胞具有相同的图像(不应该发生)。我不确定发生了什么,但我的猜测是重新加载单元格会导致图像再次下载(或从缓存中拉出),直到加载另一个单元格后才能完成。

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用图片视图的contentMode属性?

  

用于确定视图在其边界发生更改时如何布置其内容的标志。

我在查看您的实现时发现的一个问题是,您可能会在单元格中看到错误的图像。我看到你在下载图像时将单元格作为参考。这是错误的,原因如下:

表视图单元格被重用,因此当您滚动单元格时,将再次使用离开屏幕的单元格来显示其他行的信息。通过引用单元格而不是索引路径,如果下载需要时间,则在调用完成块时,该单元格可能正在显示不同行的信息,因此,您在其上应用的图像可能不是正确的。

您应该看一下Apple在下载每个表格视图单元格时保持一致性的示例:https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009394-Intro-DontLinkElementID_2