7

我在运行时获取图像的 URL,我想下载并在表格中显示这些图像。图像将被异步下载。更重要的是,我想以实际尺寸显示所有这些图像。

请帮助我。提前致谢:)

4

6 回答 6

3

首先,如果您还没有这样做,我强烈建议您使用SDWebImage进行异步下载。根据您的需要,您可以让它在内存或磁盘上缓存图像 - 后者以正确的方式完成,将它们保存在特殊的缓存文件夹中,因此 iOS 可以在空间不足时删除它们。它还在 UIImageView 上提供了一个方便的类别,类似于 AFNetworking 为您提供的,但具有更多选项和一个可选的完成块。这样你就可以做这样的事情:

#import <SDWebImage/UIImageView+WebCache.h>

...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // Create the cell...

    [cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"]
              placeholderImage:[UIImage imageNamed:@"placeholder"]
                     completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
        if (image != nil) {
            [self.images insertObject:image atIndex:indexPath.row];
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:YES];
        }
    }];
    return cell;
}

这样你就可以异步下载图像,正确设置 UIImageView,但你也可以使用块将图像保存在 NSMutableArray 中,这样你就可以告诉 tableview 正确的高度。它还告诉表格视图更新已加载图像的单元格的高度。然后当表格视图需要知道给定单元格的高度时,如果图像已加载,我们将从中获取大小:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    id image = [self.images objectAtIndex:indexPath.row];
    if ([image isKindOfClass:[NSNull class]]) {
        return defaultHeight;
    } else {
        return [image size].height + topPadding + bottomPadding;
    }
}

这样,我们甚至可以知道屏幕外图像的高度(例如,当您滚动到底部时)。此解决方案假定您首先使用 NSNull 值填充 NSMutableArray,然后在加载时将其替换为图像。最后,如果您愿意,甚至可以在显示单元格之前使用 SDWebImageManager 手动开始下载。

于 2013-03-07T11:06:36.440 回答
3

在委托方法上,您必须在完成下载后更新图像,您可以使用

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] 
                 withRowAnimation:UITableViewRowAnimationAutomatic];

这将再次调用

    -(CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath

因此,您应该使用图像的高度(如果存在)、默认高度或占位符图像(如果有)。

于 2013-03-01T23:32:04.847 回答
3

您可以UIImageView根据下载的图像制作您的尺寸,但它会看起来很糟糕

所以我建议你把你所有的图像都做成一样大小,这样看起来会很好看。

您可以使用它来制作相同大小的所有图像。

+ (UIImage *)imageScaledToSizeWithImage:(UIImage *)imagewww andsizeee:(CGSize)size
{
    //avoid redundant drawing
    if (CGSizeEqualToSize(imagewww.size, size))
    {
        return imagewww;
    }

    //create drawing context
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);

    //draw
    [imagewww drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];

    //capture resultant image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //return image
    return image;
}

但是,如果您真的想显示具有不同行大小的表,请在运行时更改行大小

当您将获得图像时,然后将图像保存在字典中,键值为行的 indexPath。

[tableImageDict setObject:image forKey:[NSString stringWithFormat:@"%i,%i",indexPath.row,indexPath.section]];

然后重新加载您的表格行。

[table reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                     withRowAnimation:UITableViewRowAnimationNone];

它会改变你的行高

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIImage *image = (UIImage *)[tableImageDict objectForKey:
                                 [NSString stringWithFormat:@"%i,%i",
                                  indexPath.row,indexPath.section]];


    if (image != nil)
    {
        return image.size.height;
    }
    else{
        return 44.0;
    }
}
于 2013-03-07T15:35:53.503 回答
2

退房heightForRowAtIndexPath:。这是关于它的另一篇文章

于 2012-04-10T17:08:40.730 回答
1

为此,您必须创建自定义 UITableviewCell 并且您可以使用此代码设置表格视图单元格的大小

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   int rowHeight =0.0f;

   // here u can get particular Url by indexPath.row, now create UIImage object using that Url 

   CGRect bioHeadingFrame = image.frame;
   rowHeight = size.height; //get the height of that image 

   return rowHeight;
}

现在您的表格单元格的高度根据图像高度增加

于 2012-04-10T17:11:02.327 回答
0

如果异步下载是您真正的问题,请参阅AFNetworking库的 UIImageView 类别。特别是这个功能:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage

您可以将此 UIimageview 类别包含到您的项目中,并设置从该类派生的单元格图像。

于 2013-03-01T19:09:32.770 回答