7

我有一个UITableView(分组!),需要计算两种样式的单元格的高度:UITableViewCellStyleDefaultUITableViewCellStyleValue2

这就是我这样做的方式UITableViewCellStyleDefault

CGSize  textSize = {300.f, 200000.0f};
CGSize  size = [myTextString1 sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];
size.height += 30.0f;
result = MAX(size.height, 44.0f);

对于UITableViewCellStyleValue2

CGSize  textSize = {207.f, 200000.0f};
CGSize  size = [myTextString2 sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];
size.height += 30.0f;
result = MAX(size.height, 44.0f);

我的问题是他们返回的高度不正确,我认为这是textSize我使用错误数字的地方。对于长文本,底部会被缩短(通常只是一行有几个单词),并且对于这两种 CellStyles,它们在单元格中的文本上方和下方都有奇怪的间距。

因为UITableViewCellStyleValue2我通过207.0f将 text.backgroundColor 设置为红色然后只计算框的大小得到了宽度大小 ( )。300.0f宽度UITableViewCellStyleDefault是单元格的大小UITableViewStyleGrouped

有谁知道我需要使用哪些值来正确计算 an 的大小,NSString从而为我的单元格获得合适的高度?

谢谢

4

6 回答 6

9

Here is the code I am using for this. It works like a charm for one type of cell. It may have some useful parts for your application.

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath {
AppAppDelegate *appDelegate = (AppAppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *Text = ([[appDelegate.myTextSectionsDelegateDict objectAtIndex:indexPath.section] objectForKey:@"Text"]);

    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [Text sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
    return labelSize.height + 15;}
于 2009-07-24T22:18:56.443 回答
2

创建单元格时,您使用的字体是否与您测量时使用的字体相同?

我使用了这个页面上的教程,一切都对我有用。它也可能对您有用:

于 2009-07-21T18:49:07.870 回答
2

看来您已经发现您使用了错误的文本大小。您可能只想使用标签的fontlineBreakMode属性来避免将来出现此问题,特别是如果您稍后在单元格中更改它们。另外,为了便于阅读,我会避免在返回数字之前增加高度。相反,我会尝试这样的事情:

CGSize textSize = CGSizeMake( 300.0, 1979 );
CGSize size = [ myTextString1 sizeWithFont:[[ cell textLabel ] font ]
                         constrainedToSize:textSize
                             lineBreakMode:[[ cell textLabel ] lineBreakMode ]];

result = MAX( size.height + 30, 44.0f );

我使用 1979 是因为根据文档,不应返回大于 2009 的值。

于 2009-07-30T04:15:26.693 回答
2

如果您想正确计算 cellvalue2 的高度,您应该使用: [UIFont boldSystemFontOfSize:15.0f]和换行模式:NSLineBreakByTruncatingTail

如果您不使用粗体,文本将正确填充,但您将丢失正确的垂直填充。

你的其余计算是正确的。

于 2012-11-17T21:07:20.993 回答
0

什么时候为我工作是根据表格视图的宽度计算约束大小:

CGSize constraintSize = CGSizeMake(tableView.frame.size.width * 0.6, 2009);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
于 2011-10-18T16:05:50.037 回答
0

最简单的方法:

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

CGFloat result = 10.0f;
if(indexPath.section == 1) // here i compare the sections
{
    result = 400.0f;
}
return result;
}

根据您拥有的部分返回值。这将为您提供自定义行高。

于 2012-01-11T00:52:36.590 回答