基于文本精确计算UITableViewCell的高度

时间:2014-03-08 22:01:51

标签: ios uitableview autolayout

我正在使用ios应用程序,并使用autolayout我正在尝试创建一个具有不同行高的表视图。

原型单元的布局如下:

enter image description here

我有一个主单元格(黑色)我有一个UIView(红色),在那个视图里面有一个UILabel(蓝色)

我添加的Autolayout约束如图所示:

UIView具有以下约束条件:

  • 80到单元格的左边缘

  • 20从单元格的右边缘

  • 从单元格的上边缘开始

  • 15从单元格的底部边缘

UILabel具有以下约束条件:

  • 20左边的UIView

  • 来自UIView右边缘的

  • 来自UIView

  • 的上边缘
  • 来自UIView底部边缘的10


我需要UILabel根据其内部的文本大小在高度上动态。 为此,我做了以下事情:

  1. 将UILabel的行数设置为0
  2. 将字体设置为Helvetica Neueu,大小为15(在界面构建器中)
  3. 将Lines Break设置为“自动换行”(在界面构建器中)
  4. 在视图Controller中,我实现了以下内容:

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        //get the item
        ListItem *item = (ListItem*) self.items[indexPath.row];
    
        //calculate the label size based on the item title that we will display
        CGSize textSize = [item.title sizeWithFont:[UIFont fontWithName:@"HelveticaNeue" size:15.0] constrainedToSize:CGSizeMake(tableView.frame.size.width - 135.f, 9999.f) lineBreakMode:NSLineBreakByWordWrapping];
    
        //return the height + the 50 to accomodate with the layout
        return textSize.height + 50.f;
    }
    

    基本上我正在做的是获取我需要显示的文本(item.title),然后调用sizeWithFont来计算我需要多少空间用于该标签并将其返回。

    在sizeWithFont方法中我传递我用于标题[UIFont fontWithName:@"HelveticaNeue" size:15.0]的字体,然后我根据图片约束约束计算的大小,通过获取tableView的宽度并减去边距得到到标签

    对于宽度:我减去80(对于UIView左)和20(对于标签左)和15(对于标签右)和20对于UIView右)

    对于高度我放9999,因为我不需要约束它来进行计算。

    在我得到所需标签的大小后,我返回了确切的高度加上15,10,10和15的标签垂直边距(总计= 50)return textSize.height + 50.f;


    问题:

    虽然我正在进行精确计算,但在运行应用程序时,它并非100%精确。虽然大多数情况下我得到一个精确的高度,但在某些情况下(特别是当我们在标签中有例如3行,而第3行有一个单词时),单元格的高度仅对应于2行并且切割第三行一。通过反复试验增加高度可能是可能的,但它也会影响显示良好的细胞的高度。

    所以我的问题是,我的计算错误是什么?有没有办法在使用autolayout时根据标签中的文字为单元格设置动态高度?

    由于

2 个答案:

答案 0 :(得分:1)

字体有可能不匹配吗?

我想,你会根据Helvetica Neue Regular进行计算。

UILabel的字体是什么?一言一语让我想到字体指标。

我没有看到其他错误

答案 1 :(得分:0)

如果您想要精确,请使用prototype cell approach。它本质上是精确的,因为你获得了实际细胞的高度。

将此方法用于动态标签高度通常涉及设置标签的文本,调用sizeToFit,然后获取标签intrinsicContentSize。这是一个example implementation