当前位置: 首页 > 知识库问答 >
问题:

动态TableViewCell高度以适合下载的图像

安经纶
2023-03-14

我按照这个答案:在UITableView中使用自动布局进行动态单元格布局

  1. 我在Storyboard原型单元中设置了约束,而不是以编程方式
  2. 图像下载异步完成。

基本上,我正在使用SDWebImage下载图像,并调整UIImageView的高度,以便它显示整个图像(当然是按比例缩小的)。我遇到的问题在下面的代码中进行了注释:

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

   // dequeue cell using identifier

  [cell.pictureView sd_setImageWithUrl:myUrl completed:^( ... block ...) {

       // This code will scale down the UIImage to the UIImageView's width maitaining
       // its aspect ratio, and also will resize the UIImageView's to match the scaled-down UIImage's height

       if(image != nil) {
         CGSize imageSize = [image size];
         CGSize imageViewSize = CGSizeMake(280.0, 100.0);

         CGFloat correctHeight = (imageViewSize.width / imageSize.width) * imageSize.height;

         [[cell pictureView] setFrame:CGRectMake([[cell pictureView] frame].origin.x,
                                                  [[cell pictureView] frame].origin.y,
                                                  CGRectGetWidth([[cell pictureView] bounds]),
                                                  correctHeight)];

           // At this point, the subviews are all set. Since this happens async, what method do I call to re-calculate this row's height.

  }];


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

    static int defaultHeight = 230;

    // Get's the offscreen cell used only for calculation purposes
    WKZEventsCell *cell = [[self offscreenCells] objectForKey:CellIdentifier];
    if(!cell) {

        // HOW DO I GET A REFERENCE TO A PROTOTYPED CELL INSIDE THE STORYBOARD??? 
        // note that calling dequeueReusableCellWithIdentifier:CellIdentifier will cause a memory leak      

        cell = ??????
        [[self offscreenCells] setObject:cell forKey:CellIdentifier];
    }

    WKZEvent *event = [[self eventList] objectAtIndex:[indexPath row]];
    [[cell titleLabel] setText:[event title]];
    [[cell placeLabel] setText:[event title]];
    [[cell pictureView] setImage:image];


    // Even tho this should be in memory cache right now, I'm pretty sure this call is still asynchronous, so this might make the whole thing wont work.
    [cell.pictureView sd_setImageWithUrl:myUrl


    // THIS METHODS ARE COMMENTED BECAUSE MY CONSTRAINTS ARE SET IN STORYBOARD, BUT NOT SURE IF I'M RIGHT AT THIS ONE
    //[cell setNeedsUpdateConstraints];
    //[cell updateConstraintsIfNeeded];

    // I DONT HAVE A MULTILINE LABEL SO I DONT CALL THIS. NOT SURE ABOUT THIS ONE EITHER
    //cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));

    [cell setNeedsLayout];
    [cell layoutIfNeeded];

    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    height += 1;

    NSLog(@"%f", height);

    return height;
}

共有1个答案

茅涵映
2023-03-14

故事板:

    < li >向表格视图添加新单元格 < li >向单元格添加新的图像视图 < li >选择性地为图像视图设置占位符图像 < li >使单元格的约束明确描述其高度

请务必将单元格的行高设置为默认值。

代码:

将表格视图设置为自大小单元格:

var tableview: UITableView {
    didSet {
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 44
    }
}

在运行时,尽快开始异步加载映像。

下载后,将图像加载到图像视图并执行:

tableView.beginUpdates()
tableView.endUpdates()
 类似资料:
  • 我有一个标签在UITableViewCell,我想我的高度TableViewCell是自动根据标签高度。

  • 这不是重复的问题,因为这个问题没有真正的解决方案 我尝试使用约束通过其内容实现< code>UITableViewcell动态高度,但得到布局警告: 将尝试通过破坏约束来恢复 在 UIView 中创建一个符号断点对于不满意的约束,以便在调试器中捕获此内容。UI视图上列出的基于 UI 的基于 UI 的布局调试类别中的方法也可能有所帮助。2019-03-15 12:27:52.085475 0400

  • 我在TableViewCell中显示了拉伸图像。我需要找到图像的高度和宽度从图像URL。我需要找到纵横比,并根据Swift4中动态单元格的高度在单元格上拟合图像。

  • 问题内容: 题: 如何使UITableViewCell高度动态变化UICollectionViewCell? 查看层次结构: UIViewController UITableView UITableViewCell UICollectionView UICollectionViewCell1 Label 1 UICollectionViewCell2 Label 2 UICollectionVie

  • 我正在设计一个具有滚动视图的页面,其上方是表格视图(禁用滚动)。为此,我在这个问题中提到了答案 - 使UITableView不可滚动并调整高度以容纳所有单元格,但没有成功。 视图层次结构以及提供的约束- -主视图 -滚动视图< br >固定在主视图的所有边上(0,0,0,0),限制边距 -内容视图 固定到滚动视图(0,0,0,0),与主视图宽度相等,与主视图高度相等(优先级-250) -内容视图中

  • 我有一个响应的背景图像在一个div。我想要一个两列柔性布局在它的顶部,其中左布局有图像的高度100%的父div与宽度自动缩放像响应图像。右边是以Flex为中心的两行文本。 这是目前为止我能得到的最接近的。但当浏览器调整大小时,flex不会拉伸以适应背景div图像,左侧图像也不会相应地缩放。 注意:代码中不应指定px的宽度和高度 null null