ios 7-维度未知的映像的异步映像下载UITableView
我正在使用针对iOS 7的XCode 6.3.1 我正在使用ios 7-维度未知的映像的异步映像下载UITableView,ios,image,uitableview,asynchronous,afnetworking,Ios,Image,Uitableview,Asynchronous,Afnetworking,我正在使用针对iOS 7的XCode 6.3.1 我正在使用AFNetworking的UIImageView类别将维度未知的图像下载到UITableViewCell。以下是一个示例图像: 我遇到的问题是,由于图像的尺寸未知,所以我只使用占位符图像。如果占位符图像具有完全相同的尺寸,则不存在问题。但是,如果尺寸不同,则单元格中的间距存在问题 如果图像小于,则间距会过大。以下是一个例子: 我不知道在下载完图像后如何刷新单元格,以便间距符合我的自动布局约束 如果我从单元格向外滚动并向后滚动,则间距
AFNetworking
的UIImageView
类别将维度未知的图像下载到UITableViewCell
。以下是一个示例图像:
我遇到的问题是,由于图像的尺寸未知,所以我只使用占位符图像。如果占位符图像具有完全相同的尺寸,则不存在问题。但是,如果尺寸不同,则单元格中的间距存在问题
如果图像小于,则间距会过大。以下是一个例子:
我不知道在下载完图像后如何刷新单元格,以便间距符合我的自动布局约束
如果我从单元格向外滚动并向后滚动,则间距很小
下面是一些下载图像的示例代码
- (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:placeholder图像:
是我用来包装AFNetworking
的setImageWithURL
。。。。它首先检查图像是否存在于本地,然后检查两个不同的URL(绝对和基本URL+相对),如果图像存在于本地
我将操纵块放在那里,以便调用我创建的UIImage
分类方法,该方法将缩放图像以适应UITableView
的宽度(因此唯一的动态部分是高度)
以下是我尝试过的事情列表:
- 重新加载特定单元格
- 重新加载整个表
[self.tableView开始更新]+[self.tableView结束更新]代码>
- 调用
[cell setNeedsLayout]
,或[cell setNeedsDiplay]代码>
setNeedsLayout
和setNeedsDisplay
加载完图像后,我没有做任何事情(我将其放置在分配图像之前调用的afterManipulation块中,并且我也尝试在分配图像之后放置它)
重新加载单元格、表或BeginUpdate会导致出现一些非常奇怪的行为。细胞开始混合在一起,一些细胞有相同的图片(这不应该发生)。我不确定发生了什么,但我猜重新加载单元格会导致图像再次下载(或从缓存中提取),直到加载另一个单元格后才会完成 您是否考虑过使用图像视图的contentMode
属性
一种标志,用于确定视图边界更改时如何布局其内容
我在查看您的实现时观察到的一个问题是,您可能会在单元格中获得错误的图像。我看到你下载图像时把手机作为参考。这是错误的,原因如下:
表格视图单元格将被重用,因此当您滚动屏幕外的单元格时,这些单元格将再次用于显示其他行的信息。通过引用单元格而不是indexpath,如果下载需要时间,则在调用完成块时,该单元格可能正在显示不同行的信息,因此,应用于该单元格的图像可能不是正确的图像
您应该看看苹果的例子,看看如何在下载每个表视图单元格的图像时保持一致性:您是否考虑过使用图像视图的contentMode
属性
一种标志,用于确定视图边界更改时如何布局其内容
我在查看您的实现时观察到的一个问题是,您可能会在单元格中获得错误的图像。我看到你下载图像时把手机作为参考。这是错误的,原因如下:
表格视图单元格将被重用,因此当您滚动屏幕外的单元格时,这些单元格将再次用于显示其他行的信息。通过引用单元格而不是indexpath,如果下载需要时间,则在调用完成块时,该单元格可能正在显示不同行的信息,因此,应用于该单元格的图像可能不是正确的图像
你应该看看苹果的例子,看看如何在下载每个表视图单元格的图像时保持一致性:我认为AFNetworking的UIImageView应该解决这个问题。如果调用了新请求,它应该取消旧请求并用新请求替换它。在他们的示例代码中,他们没有任何对indexpath(或单元格以外的内容)的引用,我认为AFNetworking的UIImageView应该解决这个问题。如果调用了新请求,它应该取消旧请求并用新请求替换它。在他们的示例代码中,他们没有任何对indexpath(或单元格以外的内容)的引用,我认为AFNetworking的UIImageView应该解决这个问题。如果调用了新请求,它应该取消旧请求并用新请求替换它。在示例代码中,它们没有任何对indexpath(或单元格以外的内容)的引用