Цель c - Увеличить высоту ячейки во время выполнения

У меня есть настраиваемая ячейка, и одна из ее меток может быть достаточно крупной, чтобы оправдать добавление кнопки «Еще». Итак, я обрезаю содержимое метки до 5 строк, а затем добавляю эту кнопку, которая расширяет содержимое, если это необходимо.

Мой вопрос: можно ли это сделать без использования reloadData tableView?

Я пробовал этот код в событии касания кнопки «Узнать больше» (внутри настраиваемой ячейки):

  self.contentView.frame = self.backgroundView.frame = self.accessoryView.frame =  CGRectMake(0, 0, self.contentView.frame.size.width, self.contentView.frame.size.height + 80);

Ничего не произошло! Я думаю, мне нужен способ увеличить высоту строки ячейки и, таким образом, высоту содержимого представления таблицы.

Заранее спасибо,


Редакция: я проверил решение по ссылке ios - развернуть ячейку представления таблицы, например Twitter app, я применил этот код в настраиваемой ячейке (в событии касания):

self.contentExpanded = YES;
UITableView *tableView = [self parentTableView];
NSIndexPath *indexPath = [tableView indexPathForCell:self];


[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

У меня сейчас 2 проблемы: 1) reloadRowsAtIndexPaths выполняет все reloadData. 2) Пользовательская ячейка - это тот, кто знает высоту ячейки. При доступе к этому методу self.contentExpanded всегда равен NO.

*** Метод parentTableView был взят из ссылки на родительский tableView объекта ячейка


Версия 2: Не думаю, что проблема в heightForRow. Я не могу избежать вызова этого метода для всех ячеек ...

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *) indexPath
 {        
    CellObject *object;  
      if(self.searchTableData)
          object = [self.searchTableData objectAtIndex:indexPath.row];
      else
          object = [self.database.cellObjectsFetchedResultsController objectAtIndexPath:indexPath];  


    id cell = [TableViewCellFactory createFromCellObject:object fromPrototypeTable:self.tableView];

    CGFloat height = [cell getHeightRowForCellObject:object];

    return height;

}

И в пользовательской ячейке:

  - (CGFloat)getHeightRowForCellObject:(CellObject *)cellObject
  {

CGFloat messageHeight = 0;

if (![cellObject.content isEqualToString:@""])
{
    UILabel *tempMessageLabel = [[UILabel alloc] init];

    tempMessageLabel.font = [UIFont systemFontOfSize:14];
    tempMessageLabel.autoresizingMask =  (UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin );
    tempMessageLabel.numberOfLines = 5;
    tempMessageLabel.text = cellObject.content;
    [tempMessageLabel sizeToFit];
    CGFloat lineHeight = [tempMessageLabel.text sizeWithFont:tempMessageLabel.font].height;
    CGSize size = [tempMessageLabel.text sizeWithFont:tempMessageLabel.font
                                    constrainedToSize:CGSizeMake(280, lineHeight * tempMessageLabel.numberOfLines)
                                        lineBreakMode:UILineBreakModeWordWrap];
    messageHeight = size.height;

    if(self.contentExpanded)
        messageHeight += 100;
}
return messageHeight;
}

person Rodrigo Ginyaume    schedule 25.03.2013    source источник
comment
Думаю, об этом уже спрашивали: stackoverflow.com/questions/14967696/   -  person Mike D    schedule 25.03.2013
comment
Спасибо, Майк! Я какое-то время проверял вопросы, но не нашел того. Я проверю это и посмотрю, решит ли это мою проблему. Я дам тебе знать позже.   -  person Rodrigo Ginyaume    schedule 25.03.2013
comment
Привет, я отредактировал свой вопрос. Я не мог заставить его работать. Может я что-то не так делаю. Пожалуйста, помогите, я могу предоставить дополнительный код, если потребуется.   -  person Rodrigo Ginyaume    schedule 25.03.2013
comment
Вы пробовали удалить beginUpdates / endUpdates?   -  person Matt    schedule 25.03.2013
comment
Покажите нам свой tableView:heightForRowAtIndexPath:.   -  person rob mayoff    schedule 25.03.2013
comment
Просто добавив [myTableView beginUpdates]; [myTableView endUpdates]; чтобы проделать знаменитый трюк, а стол все еще полностью перезагружается.   -  person Rodrigo Ginyaume    schedule 25.03.2013
comment
Да, Мэтт, я попытался сохранить только reloadRowsAtIndexPaths и получил все reloadData.   -  person Rodrigo Ginyaume    schedule 25.03.2013
comment
Вам необходимо сохранить информацию о том, какие ячейки раскрываются в делегате табличного представления или в вашей модели, не в ячейках табличного представления. Проблема в том, что вы устанавливаете флаг contentExpanded в ячейке табличного представления при нажатии кнопки «Узнать больше». Но затем, когда вам нужно получить высоту ячейки, вы создаете совершенно новую ячейку для той же строки и запрашиваете у новой ячейки ее высоту. Конечно, новая ячейка не разделяет свой contentExpanded флаг с существующей ячейкой.   -  person rob mayoff    schedule 26.03.2013
comment
Спасибо за ответ. Теперь я понимаю, как исправить вторую проблему. Однако я все еще получаю вызовы tableView:heightForRowAtIndexPath: для всех ячеек, но получаю только один вызов (ожидаемая ячейка) к tableView:cellForRowAtIndexPath:. Это ожидаемое поведение? Причина в том, что представление таблицы должно знать свою новую высоту содержимого? Если я хочу перерисовать только одну ячейку, я бы хотел избежать выполнения всей логики, содержащейся в tableView:heightForRowAtIndexPath:.   -  person Rodrigo Ginyaume    schedule 26.03.2013