2014-01-24 1 views
0

У меня есть табличное представление с настраиваемой ячейкой в ​​нем, в моей ячейке у меня есть одна метка и одно изображение, текст в ярлыке длинный, поэтому я просто покажите первые 2 строки, а затем покажите 3dots «...», используя разрывы строк, а затем, когда пользователь коснется ячейки, он будет расширяться, чтобы отобразить полный текст метки. . Я меняю высоту ячейки при записи на нее. Я делаю это вот так:Как показать полный текст метки в ячейке при изменении высоты

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
if ([tableView indexPathsForSelectedRows].count) { 

    if ([[tableView indexPathsForSelectedRows] indexOfObject:indexPath] != NSNotFound) { 


     MsgInfo *info = [_msgInfos objectAtIndex:indexPath.row]; 
     NSString *displayString = info.msg; 




     CGRect boundingRect = 
     [displayString boundingRectWithSize:CGSizeMake(self.tableView.frame.size.width - 2 * 10, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes: 
      @{ NSFontAttributeName : [UIFont fontWithName:@"B Yekan" size:18.0f]} context:nil]; 

     CGFloat rowHeight = ceilf(boundingRect.size.height); 

     NSLog(@"Height = %f for '%@'", rowHeight, displayString); 

     return 54 + rowHeight + 2 * 10; // Expanded height 


    } 

    return 92; // Normal height 
} 

return 92; // Normal height 
} 

Так что, когда я нажимаю клетку, он расширяется на основе моего текста шрифт и размер этикетки,

Но теперь я хочу, чтобы показать полный текст этикетки, я знаю, что я должен установить label.numberofline = 0 в didSelectRowAtIndexPath, но это не работает.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

static NSString *CellIdentifier = @"MsgCell"; 

UITableViewCell *cell = 
[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
            reuseIdentifier:CellIdentifier]; 
} 


UILabel *nameLabel = (UILabel *)[cell viewWithTag:100]; 

nameLabel.numberOfLines =0; 
[nameLabel sizeToFit]; 
[nameLabel setLineBreakMode:NSLineBreakByWordWrapping]; 

    [self.tableView beginUpdates]; 
[self.tableView endUpdates]; 
} 

любая помощь?

+0

вы не должны делать [[tableView indexPathsForSelectedRows] indexOfObject: indexPath], потому что indexPath является вновь созданным объектом и может отсутствовать в массиве selectedIndexPath. – santhu

ответ

1

В didSelectRowAtIndexPath вы создаете новую ячейку и меняете ее настройки (не редактируя существующую ячейку, а не какую-либо ячейку, которая будет использоваться для отображения в ближайшее время). То, что вы должны делать, это запустить перезагрузку выбранной ячейки, чтобы новая высота была пересчитана, и ячейка перезагрузилась. В tableView:cellForRowAtIndexPath: у вас должна быть аналогичная логика, чтобы проверить, выбрана ли строка, а затем установить количество строк на ярлыке.

Выполнение этого задания в tableView:cellForRowAtIndexPath: также предотвратит возникновение проблем с отменой выбора, поскольку вы всегда должны устанавливать количество строк для каждой ячейки при повторном использовании.

+0

Я пытаюсь ваше решение, но логика не работает в tableView: cellForRowAtIndexPath: можете ли вы объяснить немного больше? –

+0

Было бы полезно посмотреть, что вы пробовали и знаете, как это не сработало. Цель состоит в том, чтобы установить количество строк. Если путь указателя является выбранной строкой, установите значение 0, если не выбрано, установите значение 2. – Wain