2013-02-15 63 views
2

如果我正在自定义UITableViewCell,我需要它有一个变量高度取决于输入的长度(例如,对于Twitter阅读器或某物),我怎么能做到这一点工作?heightForRowAtIndexPath与自定义单元格和标签

我发现了很多其他的例子,可以为标准的非自定义单元格设置它,但是我的单元格的主要文本标签更小等等,所以当我尝试使用这些方法中的任何一种时我的单元格,他们给出了各种奇怪的结果(文本重叠在单元格的底部等)

是否有一个标准化的单元设计方法(例如,我应该在Interface Builder中做多大?) ,假设我的标签是单元格宽度的一半。我将如何去计算单元格需要显示加载到该标签中的字符串的高度?这里有一个我在这里找到的方法,它可以在正常单元格上正常工作,但是会将怪异高度,重叠文本等自定义单元拧紧:(我完全不知道300/200000在这里做什么,如果有人能解释我' d是感激,太!)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGSize textSize = {300.f, 200000.0f}; 
    CGSize size = [[_quoteStringsFromPlist objectAtIndex: indexPath.row] sizeWithFont: [UIFont systemFontOfSize:12.0f] constrainedToSize: textSize lineBreakMode: NSLineBreakByWordWrapping]; 
    size.height += 5.0f; 
    float result = MAX(size.height, 32.0f); 
    return result; 
} 
+0

您可以在界面生成器中完成所有操作(如果您使用的话)。在IB中选择tableview并更改行高。然后选择单元格并选择自定义单元格高度并输入相同的数字。希望能帮助到你! – Groot 2013-02-15 12:36:21

+0

恐怕这没有奏效。细胞似乎处于不同的高度,但短小的细胞上方/下方有大量空间,而较长的细胞正在被切断。我在两个地方将行高设置为90。 – Luke 2013-02-15 12:43:26

回答

0

这样的事情应该工作。

CGRect labelFrame = // enter default frame of the label here 
UIFont *labelFont = // enter label font here 
CGFloat labelBottomMargin = // enter the space between the bottom of the label and the bottom of the cell here 

CGSize size = [labelString sizeWithFont:labelFont constrainedToSize:CGSizeMake(labelFrame.size.width, MAX_FLOAT)]; 
size.height += labeFrame.origin.y; 
size.height += labelBottomMargin; 
size.height = MAX(size.height, 32.0f); 
return size.height; 
+0

这使得他们都太高,就像他们需要的高度的两倍以上。 – Luke 2013-02-15 13:05:33

+0

另外,32.0f从哪里来? – Luke 2013-02-18 17:53:22

+0

它来自你。从你原来的代码中,我认为32.0f是你想要的单元格的最小高度。如果您为labelFrame,labelBottomMargin和labelFont输入了正确的值,我提供的代码应该可以正常工作。 – user941868 2013-02-20 13:11:09

0

首先,头部到您的XIB文件,看看有多大的文本区域的顶部/底部的空白,并有多宽它。

之后,您需要使用可用宽度计算所需的高度,然后将该值添加到文本区域已有的顶部/底部边距。

无论IB中每个单元格的大小或您尝试放入其中的文本的大小如何,结果都应该正确显示。

编辑

想象一下你的尺寸为您的IB {700, 300},和你的文本区域位于{{100, 100}, {300,100}},文本区域有一个100px的保证金顶部和100px的保证金机器人,它的宽度是300

当您计算文本所需的高度时,可以用可用的300宽度进行计算。它会返回一个大小,例如{300,250}。这是你的文本所需的高度,但你的单元格中有其他东西,你需要添加这些顶部和机器人边距,所以结果是450.

请记住设置一个自动调整掩码或自动布局您的文本区域垂直延伸和边距固定(UIViewAutoresizingFlexibleHeight

+0

你能举个例子吗?我根本没有真正关注这个。故事板中的我的文本区域宽度为159,高度为74(如果这很重要,则为X 234和Y 45)。我不确定你的利润是什么意思。 – Luke 2013-02-15 12:40:40

+0

什么是文本边距属性的名称? – AlexWien 2013-02-15 12:46:00

+0

我不知道什么自动调整口罩。我很抱歉在这里成为一个问题,但我仍然不知道你的意思是这个答案。 – Luke 2013-02-15 13:08:09