动态单元格大小取决于从iOS中的URL获取的图像的大小

时间:2016-09-12 04:57:29

标签: ios objective-c uitableview uiimage autoresize

信息:

我有#this code will scrape a Reddit page from lxml import html import requests web_page = requests.get("https://www.reddit.com/r/cringe/") tree = html.fromstring(web_page.content) links = tree.xpath('//div[@class="data-url"]/text()') print links ,其中的单元格为Tableview。 在那个Imageview中,我从imgURL中获取不同的图像...

我需要什么:

我需要根据从imgURL获取的图像高度来确定单元格的动态高度。

  

注意:我没有使用自动布局,但我正在使用自动调整大小。

到目前为止我做了什么:

我在ImageView中使用了异步Image加载。 (Imageview

#import "UIImageView+WebCache.h"

right now screen of tableview

这有什么解决方案吗?或者我们可以仅使用自动布局进行单元格大小调整吗?

提前致谢..

3 个答案:

答案 0 :(得分:4)

在理想情况下,我通常希望API返回所有具有相同大小或大小的图像,这些图像可以通过查询字符串参数进行配置,例如:/get_image/?width=400&height=400等。

无论如何,这里的问题是,一旦创建并准备好将其绘制到屏幕上,就无法更新单元格的高度(换句话说,一旦它从{{1返回)除非您手动重新加载该单元格或整个表视图,否则。幸运的是,cellForRowAtIndexPath以异步方式工作,这意味着一旦获取并存储了图像,您将有机会呼叫sd_setImageWithURL

重新加载会导致在重新加载的单元格上调用tableView.reloadRowsAtIndexPath,这样我们这次就能获得正确的高度。

(由于表格视图单元格是可重复使用的对象,因此它们不会存储有关所用数据的任何信息,以便配置其UI。因此,您需要将图像存储在视图控制器中,最好是在数组中。)

heightForRowAtIndexPath

尽管如此,您可以在@interface ViewController () @property (nonatomic, strong) NSMutableArray *fetchedImages; @end @implementation ViewController ... - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = [self.fetchedImages objectAtIndex:indexPath.row]; if (image) { return image.size.height + 1.0; // 1.0 for the separator. } else { return 50.0; // Default value.. } } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.fetchedImages.count; } 方法中执行以下操作:

(tableView:cellForRowAtIndexPath:)

以下是我最终的结果:

enter image description here

您可以下载test project并使用它来更好地了解我上面做了什么。

答案 1 :(得分:1)

此代码适用于自动调整大小,可能对您有帮助。

#define Screen_Width [[UIScreen mainScreen] bounds].size.width
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
{
    return imageHeight;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 NativeStreamAdCell *cell=(NativeStreamAdCell *)[tableView dequeueReusableCellWithIdentifier:@"SimpleTable"];
        if(cell==nil)
        {
            NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"NativeStreamAdCell" owner:self options:nil];
            cell=[nib objectAtIndex:0];
        }
         [cell.postImg sd_setImageWithURL:[NSURL URLWithString:[dic_feed valueForKey:@"feed_image"]] placeholderImage:cell.postImg.image options:SDWebImageRefreshCached];
        //Display image based on size
        UIImage *img = cell.postImg.image;

        int image_width = img.size.width;
        int image_height = img.size.height;
        image_width = Screen_Width;
        image_height = (Screen_Width * img.size.height / img.size.width);
        if(image_width > image_height) {
            image_height = (Screen_Width * image_height / image_width);
        }
        cell.postImg.frame = CGRectMake(cell.postImg.frame.origin.x, cell.postImg.frame.origin.y,
                                     image_width,image_height);

        imageHeight =  CGRectGetMaxY(cell.postImg.frame);
        return cell;
}

答案 2 :(得分:0)

关注example of Ozgur Vatansever,但在快速滚动时会闪烁。

即使this没有帮助。

我发现article_comment_path(comment.article, comment)代替

[self.tableView reloadData]

OR

[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];