У меня есть настраиваемая ячейка, и одна из ее меток может быть достаточно крупной, чтобы оправдать добавление кнопки «Еще». Итак, я обрезаю содержимое метки до 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;
}
tableView:heightForRowAtIndexPath:
. - person rob mayoff   schedule 25.03.2013contentExpanded
в ячейке табличного представления при нажатии кнопки «Узнать больше». Но затем, когда вам нужно получить высоту ячейки, вы создаете совершенно новую ячейку для той же строки и запрашиваете у новой ячейки ее высоту. Конечно, новая ячейка не разделяет свойcontentExpanded
флаг с существующей ячейкой. - person rob mayoff   schedule 26.03.2013tableView:heightForRowAtIndexPath:
для всех ячеек, но получаю только один вызов (ожидаемая ячейка) кtableView:cellForRowAtIndexPath:
. Это ожидаемое поведение? Причина в том, что представление таблицы должно знать свою новую высоту содержимого? Если я хочу перерисовать только одну ячейку, я бы хотел избежать выполнения всей логики, содержащейся вtableView:heightForRowAtIndexPath:
. - person Rodrigo Ginyaume   schedule 26.03.2013