我正在开发一个ios应用程序,并使用autolayout我正在尝试创建一个具有不同行高的表视图 .
原型单元的布局如下:
我有一个主单元格(黑色)里面有一个UIView(红色),里面有一个UILabel(蓝色)
我添加的Autolayout约束如图所示:
The UIView has the following Constraints:
- 80到单元格的左边缘
从单元格的右边缘
- 20
从单元格的上边缘
- 15
从单元格的底部边缘
- 15
The UILabel has the following Constraints:
- 20到UIView的左边缘
从UIView的右边缘
- 15
从UIView的上边缘
- 10
从UIView的下边缘
- 10
我需要UILabel根据其内部的文本大小在高度上动态 . 为此,我做了以下事情:
-
将UILabel的行数设置为0
-
将字体设置为Helvetica Neueu,大小为15(在界面构建器中)
-
将Lines Break设置为"Word wrap"(在界面构建器中)
在视图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方法中,我传递我用于 Headers [UIFont fontWithName:@"HelveticaNeue" size:15.0]
的字体,然后根据图片约束约束计算的大小,获取tableView的宽度并减去边距以获得标签
对于宽度:我减去80(对于UIView左)和20(对于标签左)和15(对于标签右)和20对于UIView右)
对于高度我放9999,因为我不需要约束它来进行计算 .
在我得到所需标签的大小后,我返回了确切的高度加上标签的垂直边距为15,10,10和15(总计= 50) return textSize.height + 50.f;
The problem:
虽然我正在进行精确计算,但在运行应用程序时,它并非100%精确 . 虽然大多数情况下我得到一个精确的高度,但在某些情况下(特别是当我们在标签中有例如3行,而第3行有一个单词时),单元格的高度仅对应于2行并且切割第三行一 . 通过试验和错误增加高度可能是可能的,但它也会影响显示良好的细胞的高度 .
所以我的问题是,我的计算错误是什么?当使用autolayout时,有没有办法根据标签中的文本为单元格设置动态高度?
谢谢
2 回答
字体不匹配的可能性有多大?
我想你会根据Helvetica Neue Regular进行计算 .
UILabel是什么字体?一言一语让我想到字体指标 .
我没有看到另一个错误
如果您想要精确,请使用prototype cell approach . 它本质上是精确的,因为你获得了实际细胞的高度 .
将此方法用于动态标签高度通常涉及设置标签的文本,调用
sizeToFit
然后获取标签intrinsicContentSize
. 这是example implementation .