heightForRowAtIndexPath用于更长的NSStrings

时间:2009-07-21 18:07:02

标签: iphone uitableview nsstring

我有UITableView(Grouped!),需要计算两种样式的单元格的高度: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的{​​{1}}宽度是UITableViewCellStyleDefault单元格的大小。

有谁知道我需要使用哪些值来正确计算UITableViewStyleGrouped的大小,从而为我的细胞获得合适的高度?

感谢

6 个答案:

答案 0 :(得分:9)

这是我正在使用的代码。它就像一种细胞的魅力。它可能会为您的应用程序提供一些有用的部分。

- (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;}

答案 1 :(得分:2)

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

我在this page使用了教程,一切都适合我。它也可能对你有用:

答案 2 :(得分: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年的值。

答案 3 :(得分:2)

如果要为cellvalue2正确计算高度,您应该使用: [UIFont boldSystemFontOfSize:15.0f]和linebreakmode:NSLineBreakByTruncatingTail

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

你的其余计算是正确的。

答案 4 :(得分:0)

什么时候为我工作是根据表视图的宽度计算constraintSize:

CGSize constraintSize = CGSizeMake(tableView.frame.size.width * 0.6, 2009);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

答案 5 :(得分: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;
}

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