基于Text精确计算一个UITableViewCell的Height
Posted
技术标签:
【中文标题】基于Text精确计算一个UITableViewCell的Height【英文标题】:Precise calculation of the Height of a UITableViewCell Based on Text 【发布时间】:2014-03-08 22:01:51 【问题描述】:我正在开发一个 ios 应用程序,我正在尝试使用自动布局创建具有不同行高的表格视图。
原型单元格布局如下:
我有一个主单元格(黑色),里面有一个 UIView(红色),里面有一个 UILabel(蓝色)
我添加的Autolayout约束如图:
UIView 有以下约束:
80 到单元格的左边缘
距离单元格右边缘20
距离单元格顶部边缘 15
距离单元格底部边缘 15
UILabel 具有以下约束:
到 UIView 的左边缘 20
距离 UIView 右边缘 15
距离 UIView 的上边缘 10 个
距离 UIView 底部边缘 10
我需要 UILabel 根据其中的文本大小在高度上保持动态。 为此,我做了以下工作:
-
设置UILabel的行数为0
将字体设置为 Helvetica Neueu,大小为 15(在界面生成器中)
将换行符设置为“自动换行”(在界面构建器中)
在视图控制器中,我实现了以下内容:
- (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 行并切割第三行一。通过反复试验增加高度可能是可能的,但它也会影响显示良好的单元格的高度。
所以我的问题是,我的计算有什么问题?使用自动布局时,有没有办法根据标签中的文本为单元格设置动态高度?
谢谢
【问题讨论】:
你为什么使用tableView.frame.size.width - 135.f
?不可以直接访问UILabel
的frame
吗?
@lootsch 没有。这是ios最大的问题。它需要在绘制内容之前计算表格视图的高度(这是一个设计决定,我不知道为什么)但是当通过 heightForRowAtIndexPath 计算表格高度时,视图尚未绘制并且它们都有大小为零。表格视图宽度是当时唯一可以访问的东西
对不起,我的错。我记得这个话题。我不得不自己处理很多次这个问题,仍然忘记了这个问题:/但我看不出有误算。
字体不匹配的可能性?我认为您会根据 Helvetica Neue Regular 进行计算。 UILabel
的字体是什么?一字之差让我想到字体指标。我没有看到另一个错误。
@mbm29414 谢谢你,这就是问题所在。我在界面构建器中使用了 Helvetica Neue Bold,但在代码中指定了常规。将此添加为接受它的答案。
【参考方案1】:
字体不匹配的可能性?
我认为,您会根据 Helvetica Neue Regular 进行计算。
UILabel 的字体是什么?一字之差让我想到字体指标。
我没有看到另一个错误
【讨论】:
谢谢这是问题所在。我为 uilabel 使用粗体字体。【参考方案2】:如果您想要精确,请使用prototype cell approach。它本质上是精确的,因为您得到的是实际单元格的高度。
对动态标签高度使用这种方法通常涉及设置标签的文本,调用sizeToFit
,然后获取标签的intrinsicContentSize
。这是example implementation。
【讨论】:
OP 指定他正在使用原型。 @mbm29414 你误会了。该链接讨论了一种方法,您可以在其中实例化原型单元并使用它来计算单元高度。不是 OP 在做什么。 SO 应该是答案的最后一站,而不是可以更改/中断的链接。您使用了我回复的特定术语。基于它包含在 Xcode 中,Apple 已经对该术语提出了要求。我会解释您的答案或更新链接中的术语,以明确您不是在谈论 Apple 风格的原型单元。以上是关于基于Text精确计算一个UITableViewCell的Height的主要内容,如果未能解决你的问题,请参考以下文章