2010-06-18 134 views
55

我在每个单元格内都有经典的UITableView编组UITableView。此文本视图可以是单行或多行,并且我希望单元格随着用户写入和文本开始新行而增加其高度。如何动态调整UITableViewCell高度

我的问题是:我是否需要重新加载整个表格才能增加单元格的高度?没有其他方法吗?

我一直在寻找很多东西,以前的答案和教程只是谈论如何计算文字高度,如何实现heightForRowAtIndexPath ...我已经知道的东西。我担心的是,为了达到我想要的水平,我将不得不计算身高,并在用户每次输入一个新字符时重新加载表格,而我发现这个字符并不十分干净或高效。

谢谢。

回答

60

您不必总是重新加载整个表格。你可以改为重新加载一行。

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; 
+0

谢谢!但我现在有另一个问题:我只是想重新加载该行来增加它的大小,我不希望单元格内容被再次实例化。但是,dequeueReusableCellWithIdentifier:@“customid”仅在第二次调用后才开始重用。 我该怎么办? – araid 2010-06-22 11:55:48

+0

@rickharrison其实你可以,看看我的答案。 – 2012-10-25 08:16:02

+0

它的工作真的很好,但单元格的内容分别增长。我怎样才能避免这种情况? – Gal 2013-04-23 08:24:14

26

更具体地讲,是的,你必须实现tableView:heightForRowAtIndexPath:来计算新的高度,然后做的rickharrison说,并呼吁[tableView reloadRowsAtIndexPaths:withRowAnimation]。假设你的细胞可以有一个扩大的高度和一个正常的高度,并且你希望它们在点击时增长。你可以这样做:

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*) indexPath 
{ 
    if ([expandedPaths containsObject:indexPath]) { 
     return 80; 
    } else { 
     return 44; 
    } 
} 

-(void)tableView:(UITableView*) didSelectRowAtIndexPath:(NSIndexPath*) indexPath 
{ 
    [expandedPaths addObject:indexPath]; 
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 
79
[tableView beginUpdates]; 
[tableView endUpdates]; 
+13

试一下,这段代码强制UITableView重新加载单元大小,但不是单元格内容。 – 2011-06-28 11:43:26

+0

虽然这基本上起作用,但如果将单元格增长为使用自动行转换重新加载单元格时,它不会产生动画的平滑效果。 – 2012-02-22 04:08:25

+1

太棒了。如果你想在你的某些行上使用动画,可以使用它和reloadRowsAtIndexPaths一起使用。 – 2013-05-08 06:12:49

5

-reloadRowsAtIndexPaths:withRowAnimation没有调整的UITableViewCell高度,即使我改变了细胞的框架。它只有当我跟着它-reloadData

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade]; 
[tableView reloadData]; 
+0

也许你引用了错误的indexPath,如果你调试了应用程序,你清楚地看到在你调用tableView之后reloadRowsAtIndexPath:实际调用tableView:heightForRowAtIndexPath方法。 – 2015-04-08 22:58:01