2013-05-31 5 views
3

У меня есть UITableView, у которого есть пользовательский UITableViewCells, который является комментариями пользователей. Прямо сейчас у меня есть ячейки высотой 115.0 футов, но я хочу, чтобы высота изменялась в зависимости от того, как долго длится комментарий. Если в комментарии больше трех строк, я хочу, чтобы пользователь мог выбрать ячейку, а ячейка для расширения отображала весь комментарий. Я использую метод [UIView animateWithDuration: completion: для расширения ячейки, но я не знаю, как определить правильный размер ячейки, которая должна основываться на длительности текста. Кто-нибудь может мне помочь? Вот код:Как рассчитать требуемую высоту динамического размера UITableViewCells на основе NSString

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    if (indexPath.row == 0) 
    { 
     return 480; 
    } 
    else 
    { 
     if (self.cellType == 0) 
     { 
      return 115; 
     } 
     else 
     { 
      return 75; 
     } 
    } 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row > 0) 
    { 
     NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section]; 
     UITableViewCell *cell = [tableView cellForRowAtIndexPath:path]; 
     if ([cell isKindOfClass:[CommentCell class]]) 
     { 
      CommentCell *cell = (CommentCell *)[tableView cellForRowAtIndexPath:indexPath]; 
      UILabel *label = cell.commentBodyLabel; 
      NSString *theText = label.text; 
      CGSize constraintSize = CGSizeMake(label.frame.size.width, label.frame.size.height); 
      CGSize labelSize = [theText sizeWithFont:label.font constrainedToSize:constraintSize lineBreakMode:label.lineBreakMode]; 
      CGFloat labelHeight = labelSize.height; 
      int numLines = (int)(labelHeight/label.font.leading); 
      NSLog(@"there are %i lines", numLines); 
      NSLog(@"The text height is %f", labelHeight); 
      if (numLines == 3) 
      { 
       //This is where I should expand the cell 
      } 
     } 

ответ

1

Посмотрите в NSString UIKit Additions

Вы непосредственно заинтересованы в sizeWithFont:constrainedToSize:lineBreakMode:

Установите CGSize.width свойства constrainedToSize по ширине вашей ячейки области/метки. А затем установите CGSize.height на очень большое количество, вероятно, CGFLOAT_MAX. Идея состоит в том, что вы говорите: «Эй, этот ярлык должен соответствовать области, которая является статической шириной, но она может продолжаться вертикально навсегда. Итак, скажите мне, насколько высоко эта метка будет на самом деле предоставлена ​​информация, которую я вам дал «.

NSString *comment = @"Some really long comment that does not fit in the standard cell size. This comment will be wrapped by word. Some more words to make this longer..."; 

CGSize renderedSize = [comment sizeWithFont:myFont constrainedToSize:CGSizeMake(kCellWidth, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping]; 

renderedSize.height значение, которое вы бы вернуться на (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

+1

Спасибо за быстрый ответ! –

+1

Метод возвращает 0 для renderedSize. –

1

Одним из способов является instantiate prototype cells и иметь их вычислить их динамическую высоту на основе приведенных данных. Этот метод позволяет вам полагаться на макет раскадровки (если вы используете раскадровки), не имея необходимости жестко кодировать информацию о конфигурации вашей ячейки в контроллере представления.

EDIT Я добавил рабочий пример клеток с динамическими этикетками высоты с помощью TLIndexPathTools, которая автоматически вычисляет динамические высоты для вас, если ваша клетка реализует протокол TLDynamicHeightView. См. "Dynamic Height" example project. Расчет высоты делается в камере, как это:

@interface DynamicHeightCell() 
@property (nonatomic) CGSize originalSize; 
@property (nonatomic) CGSize originalLabelSize; 
@end 

@implementation DynamicHeightCell 

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    self.originalSize = self.bounds.size; 
    self.originalLabelSize = self.label.bounds.size; 
} 

- (void)configureWithText:(NSString *)text 
{ 
    self.label.text = text; 
    [self.label sizeToFit]; 
} 

#pragma mark - TLDynamicSizeView 

- (CGSize)sizeWithData:(id)data 
{ 
    [self configureWithText:data]; 
    CGSize labelSize = self.label.bounds.size; 
    CGSize size = self.originalSize; 
    size.width += labelSize.width - self.originalLabelSize.width; 
    size.height += labelSize.height - self.originalLabelSize.height; 
    return size; 
} 

@end 

В сущности, вы помните исходные размеры, когда клетка пробуждается из раскадровки. Затем, когда выполняется расчет, позвоните по номеру sizeToFit и используйте новый размер для вычисления дельта высоты и добавьте его к исходной высоте. В раскадровке вам нужно установить ширину метки до нужной ширины и установить числовые линии на 0.

На стороне контроллера просмотра, если вы используете TLIndexPathTools, вам просто нужно настроить данные модель с массивом строк и установить метку на ячейках. Расчеты прототипов и размеров выполняются автоматически базовым классом TLTableViewController. Если вы не хотите использовать TLIndexPathTools, вы должны потянуть биты с TLTableViewController.

@implementation DynamicHeightTableViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.indexPathController.items = @[ 
      @"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", 
      @"Fusce ac erat at lectus pulvinar porttitor vitae in mauris. Nam non eleifend tortor.", 
      @"Quisque tincidunt rhoncus pellentesque.", 
      @"Duis mauris nunc, fringilla nec elementum nec, lacinia at turpis. Duis mauris nunc, fringilla nec elementum nec, lacinia at turpis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.", 
      ]; 
} 

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *item = [self.indexPathController.dataModel itemAtIndexPath:indexPath]; 
    DynamicHeightCell *dynamicCell = (DynamicHeightCell *)cell; 
    [dynamicCell configureWithText:item]; 
} 
+0

В конечном счете, его вопрос: «Но я не знаю, как определить правильный размер, в котором ячейка должна основываться на том, как долго текст». –

+0

Добавлен рабочий пример. Надеюсь, это поможет. –

+0

@ChrisWagner Извините, я собрал рабочий пример, чтобы проиллюстрировать решение. –

Смежные вопросы