【问题标题】:How to dynamically resize UITableViewCell height如何动态调整 UITableViewCell 高度
【发布时间】:2011-03-05 09:40:37
【问题描述】:

我在每个单元格内都有经典的分组 UITableView 和可编辑的 UITextViews。此文本视图可以是单行或多行的,我希望单元格在用户书写时增加其高度并且文本开始新行。

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

找了很多,之前的答案和教程只讲了如何计算文字高度,如何实现heightForRowAtIndexPath……我已经知道的东西。我担心的是,为了达到我想要的效果,每次用户输入一个新字符时我都必须计算高度并重新加载表格,我觉得这不是很干净或高效。

谢谢。

【问题讨论】:

    标签: iphone uitableview resize uitextview


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!但是我现在有另一个问题:我只想重新加载该行以增加其大小,我不希望再次实例化单元格内容。但是, dequeueReusableCellWithIdentifier:@"customid" 仅在第二次调用后才开始重用。我能做什么?
    • @rickharrison 实际上你可以,在下面查看我的答案。
    • 它的工作非常好,但单元格的内容分别增长。我怎样才能避免这种情况?
    • 我有一个大问题...我的单元格中有一个 TextField,调用 reload(anything) 将导致我的文本字段放弃第一响应者的身份。有什么想法吗?
    • 以编程方式保存行的 IndexPath 并将 becomeFirstResponder 设置为 TextField
    【解决方案2】:

    更具体地说,是的,您必须实现 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];
    }
    

    【讨论】:

      【解决方案3】:
      [tableView beginUpdates];
      [tableView endUpdates];
      

      【讨论】:

      • 试一试,此代码强制 UITableView 仅重新加载单元格大小,而不是单元格内容。
      • 虽然这基本上可行,但如果您增加单元格,它不会像使用自动行转换重新加载单元格那样产生平滑的动画。
      • 太棒了.. 如果您想在某些行上显示动画,请与 reloadRowsAtIndexPaths 一起使用。
      • 我在“shouldChangeTextIn”中添加了这段代码。并且工作正常。但不适用于新行,并且在输入字符后会增长
      【解决方案4】:

      -reloadRowsAtIndexPaths:withRowAnimation 没有调整 UITableViewCell 的高度,即使在我更改了 Cell 的框架之后也是如此。仅当我使用-reloadData 跟踪它时才有效:

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

      【讨论】:

      • 也许你引用了错误的 indexPath,如果你调试应用程序你会清楚地看到在你调用 tableView reloadRowsAtIndexPath 之后:实际上调用了方法 tableView:heightForRowAtIndexPath。
      猜你喜欢
      • 2015-03-25
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多