Изменить размер статического UITableViewCell динамически

У меня есть UITableView это имеет ряд статических ячеек. Там нет прототипов.

Одна клетка как UITextField и UITextView, Я хочу 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 ответа

Решение

Вы можете использовать маленький трюк. Создать 2 iVars

1)  NSIndexPath *selectedIndex;
2)  BOOL isTextViewFull;

При переключении Hide/Show 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;
}

Вот способ получить ваш IndexPath для 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];
   }

Когда дело доходит до динамического изменения высоты ячеек таблицы.

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

используйте этот метод и верните значение, которое, по вашему мнению, должно иметь ваша ячейка, например, если ваша метка внутри ячейки также создается динамически, то возвращает размер метки в соответствии с созданным вами значением.

Надеюсь это поможет.

Другие вопросы по тегам