2012-04-10 85 views
7

我在运行时获取图像的URL,并且我想要下载&将这些图像显示在表格中。图像将被异步下载。更重要的是,我想用他们的实际尺寸显示所有这些图像。根据下载的图像高度调整表格单元高度

请帮助我。在此先感谢:)

+0

几个问题的亚人。这些图像会占用完整的320px宽度的屏幕吗?或者不管宽度如何,它们都会显示在另一个下面?或者,如果前一幅图像的宽度小于320,并且下一幅图像也可以适合其余宽度(320-prev_img_width),则会出现在前一幅图像旁边或前一幅图像下方。 – 2013-03-01 19:05:57

回答

2

退房heightForRowAtIndexPath:。这是关于它的另一个post

1

为u必须创建自定义的UITableViewCell和U可以使用此代码

-(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; 
} 

现在你的表格单元格的高度根据图像高度

+1

你说的是对的。但要下载并显示表格视图单元格中的图像,我正在使用Asynchronous View类。我将图像URL传递给此类(异步视图类)以进行下载。我只有在下载图像后才能得到实际的图像大小。那么,我怎么能告诉tableview重新加载和制作图像大小的各个单元格。 – rahul 2012-04-11 06:36:18

+1

只是搜索SO:http://stackoverflow.com/a/4448393/207616 – 2013-03-01 19:03:27

+1

relikd是正确的。 reloadRowsAtIndexPaths是关键。 – 2013-03-01 19:13:44

0

如果是增加设置表视图单元格的大小异步下载是你真正的问题,请参考AFNetworking库的UIImageView类别。尤其是此功能:

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

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

3

在下载完就可以使用

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

这将再次调用

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

何时更新图像委托方法所以,你应该使用图像的高度,如果它存在,默认高度,或占位符图像(如果有)。

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手动开始下载。

+0

你为什么得到这个+50? – Rajneesh071 2013-03-08 07:58:16

+0

我同意SDWebImage是一个伟大的图书馆,但它不应该是这个问题的正确答案,它应该已经得票,但不是赏金点。 – 2013-03-18 14:57:59

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; 
    } 
} 
相关问题