动态调整静态UITableViewCell的大小

时间:2014-07-04 09:56:16

标签: ios objective-c uitableview heightforrowatindexpath

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

一个单元格为UITextFieldUITextView。我希望隐藏UITextView,具体取决于UITextField的输入。这不是问题。

我的问题是我想要调整这两个控件所在的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

正如我对动态原型尺寸的要求一样?

2 个答案:

答案 0 :(得分:0)

你可以用一点技巧。 创建2个iVars

1)  NSIndexPath *selectedIndex;
2)  BOOL isTextViewFull;

切换隐藏/显示textView

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

答案 1 :(得分:0)

动态更改tableviewcells的高度。

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

使用此方法并返回您认为ur cell应具有的值, 例如,如果单元格内的ur标签也是动态创建的,那么按照你创建的标签返回标签的大小。

希望这有帮助。