Изменить размер статического 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.
}
используйте этот метод и верните значение, которое, по вашему мнению, должно иметь ваша ячейка, например, если ваша метка внутри ячейки также создается динамически, то возвращает размер метки в соответствии с созданным вами значением.
Надеюсь это поможет.