【问题标题】:resize static UITableViewCell dynamically动态调整静态 UITableViewCell 的大小
【发布时间】:2014-07-04 09:56:16
【问题描述】:

我有一个UITableView,它有许多静态单元格。没有原型。

一个单元格为UITextFieldUITextView。我希望根据UITextField 的输入隐藏UITextView。这不是问题。

我的问题是我想调整这两个控件所在的 UITableViewCell 的大小 - 这样当 UITextView 被隐藏时,单元格高度为 30,当它显示时其高度为 70(这使UITextView 完全可见)。

由于它们是静态单元格,我只需将 IB 中的高度设置为 70(最大),因此当 UITextView 隐藏时,单元格中有很多未使用的空间,我想通过将单元格高度更改为 30。

我假设我需要告诉单元格使用类似的东西重绘

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

但是如何从子视图(UITextField)中获取对单元格的引用?

另外,我如何告诉单元格新的高度?我应该标记它并使用

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

就像我想要的动态原型尺寸一样?

【问题讨论】:

  • 如您所写,您可以添加与所选行相等的标签。您还可以创建 CellTextField 以保留 UITableViewCell 的 NSIndexPath 或保留对父单元格的弱引用。
  • 嗨,这不是重复的,因为我还在询问如何在编辑文本框时获取对单元格的引用 - 正如标记的答案中所回答的那样。感谢您的回复!

标签: ios objective-c uitableview heightforrowatindexpath


【解决方案1】:

你可以使用一个小技巧。 创建 2 个 iVar

1)  NSIndexPath *selectedIndex;
2)  BOOL isTextViewFull;

在切换隐藏/显示文本视图时

if(showfulltextview)
{
   selectedIndex  =  indexPath; // IndexPath of the current cell selected
   isTextViewFull =  YES;
}
else
{
   selectedIndex  =  nil;
   isTextViewFull =  NO;
}

[_yourTableView reloaddata];

现在您可以在您的委托中使用这些 iVars

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   CGFloat height = 30;
   if(isTextViewFull && indexPath.row == selectedIndex.row)
   {
     height = 70;
   }

  return height;
}

如果您没有跟踪它,这是一种获取 TextField 的 IndexPath 的方法。在 Textfield Delegate 中编辑 Textfield 时

- (void)textFieldDidBeginEditing:(UITextField *)textField
  {
     // Get the cell in which the textfield is embedded
     id textFieldSuper = textField;
     while (![textFieldSuper isKindOfClass:[UITableViewCell class]]) {
           textFieldSuper = [textFieldSuper superview];
     }
     NSIndexPath *indexPath = [_yourTableView indexPathForCell:(UITableViewCell *)textFieldSuper];
   }

【讨论】:

  • 谢谢,这是我缺少的一点 - 获取文本框父单元格的代码。谢谢!
  • 我实际上还有另一个问题。由于每行有多个具有不同大小的静态行(它们不是标准大小,它们是针对其内容按行设计的)当我使用 height forrowatindexpath 时,我需要返回所有单元格的高度。我将提出一个新问题,但我需要获取在 IB 中设置的单元格的高度
  • @JamesDawson 在委托内 heightForRowAtIndexPath 您可以计算内容的高度。对于 ex 根据其内容获取 textView 的大小,请参阅此...stackoverflow.com/questions/23649162/…
  • 单元格没有可变文本内容,内容要么是单行标签和文本区域,要么是单行标签。我知道如何根据模型中的文本内容来调整单元格的大小,但是在这里我根据 UITextVIew 是否隐藏来使单元格变大/变小。
  • 例如:您计算的标签高度为 20,您的 textView 高度为 80,在顶部添加 5 个边距,在底部添加 5 个边距,因此总高度变为 20+80+5+5 = 110;现在,您只需使用 heightForRowAtIndexPath 中的条件,例如 .... height = 30; if(isTextViewFull && indexPath.row == selectedIndex.row){ height += 80; } 返回高度;现在的问题是如何为此获得 20(标签高度)或 80(TextView 高度),您可以参考我上面评论中的链接,或者您可以谷歌它:)
【解决方案2】:

当涉及到动态改变 tableviewcells 的高度时。

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return Yourvalue; //return whatever u want ur cell to have size.
  }

使用此方法并返回您认为您的单元格应具有的值, 例如,如果单元格内的您的标签也是动态创建的,则根据您创建的标签返回标签的大小。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多