Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios 7-维度未知的映像的异步映像下载UITableView_Ios_Image_Uitableview_Asynchronous_Afnetworking - Fatal编程技术网

ios 7-维度未知的映像的异步映像下载UITableView

ios 7-维度未知的映像的异步映像下载UITableView,ios,image,uitableview,asynchronous,afnetworking,Ios,Image,Uitableview,Asynchronous,Afnetworking,我正在使用针对iOS 7的XCode 6.3.1 我正在使用AFNetworking的UIImageView类别将维度未知的图像下载到UITableViewCell。以下是一个示例图像: 我遇到的问题是,由于图像的尺寸未知,所以我只使用占位符图像。如果占位符图像具有完全相同的尺寸,则不存在问题。但是,如果尺寸不同,则单元格中的间距存在问题 如果图像小于,则间距会过大。以下是一个例子: 我不知道在下载完图像后如何刷新单元格,以便间距符合我的自动布局约束 如果我从单元格向外滚动并向后滚动,则间距

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

我正在使用
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(或单元格以外的内容)的引用