Код, который вы опубликовали, не отображается (согласно вашему комментарию), чтобы наложить новые ярлыки поверх старых. Однако при каждом вызове метода он создает новую ячейку. Это не обычный шаблон дизайна.
Обычный шаблон - перерабатывать ячейки и создавать новые, только если переработанный недоступен. Используя этот подход, вам нужен (согласно вашему комментарию) какой-то способ отслеживания метки. (Один из способов сделать это показан во фрагменте ниже.)
Вы не опубликовали свой tableView: heightForRowAtIndexPath: метод. В зависимости от того, что там происходит, вы можете получить странное поведение, т. Е. Если высота строки не соответствует высоте метки. Также неясно, когда вы вызываете reloadData (или один из связанных методов) для tableView. Это нужно вызвать, чтобы iOS могла обновить высоту строки ячейки. Может быть, все в порядке в вашем коде - но определенно стоит проверить.
Я протестировал следующий код, и он расширяет и уменьшает ячейки так, как я думаю, вы пытаетесь достичь в своем вопросе. Для моего удобства этот код просто проверяет, соответствует ли строка указанному числу, чтобы определить, является ли он расширенным или нет. Вы замените [extendedIndexPathsArray containsObject: indexPath] вместо my ([indexPath row] == _pgSpecialRow).
Я отделил работу, добавив два дополнительных метода (хотя здесь меньше кода). Это частично для удобства чтения и частично потому, что tableView: heightForRowAtIndexPath: методы должны делать те же суммы, что и tableView: cellForRowAtIndexPath: method
- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* cellIdentifier = @"Cell";
// see if there's a cell available to recylce
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell)
{
// there's no cell to recycle, so make a new one
// add a label to it and tag the label so we can find it later
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier];
UILabel* label = [[UILabel alloc] init];
// do set up on label that doesn't vary with cell content
[label setTag: 101];
label.lineBreakMode = UILineBreakModeWordWrap;
label.backgroundColor = [UIColor blueColor];
label.font = [UIFont systemFontOfSize:FONT_SIZE];
[[cell contentView] addSubview:label];
[label release];
}
// either on a recycled cell or on the cell just created, set the contents
NSArray *sectionContents = [[self tableData] objectAtIndex:[indexPath section]];
NSString *contentForRow = [sectionContents objectAtIndex:[indexPath row]];
UILabel* label = (UILabel*)[[cell contentView] viewWithTag:101];
[self adjustLabel: label forText:contentForRow andExpanded:([indexPath row] == _pgSpecialRow)];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
- (void) adjustLabel: (UILabel*) label forText: (NSString*) text andExpanded: (BOOL) expanded;
{
label.text = text;
CGFloat height = [self heightForLabelWithText: text expanded: expanded];
label.frame = CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), height);
label.numberOfLines = expanded ? 0: 2;
}
- (CGFloat) heightForLabelWithText: (NSString*) text expanded: (BOOL) expanded;
{
CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
if (expanded)
{
return MAX([text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap].height, 44.0);
}
return MIN([text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap].height, 44.0);
}
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSArray *sectionContents = [[self tableData] objectAtIndex:[indexPath section]];
NSString *contentForRow = [sectionContents objectAtIndex:[indexPath row]];
// return a cell height that's big enough (with a bit of extra margin)
return [self heightForLabelWithText: contentForRow expanded:([indexPath row] == _pgSpecialRow)]+ 16.0;
}