Динамическая высота ячейки таблицы с помощью Autolayout iOS 6 +

У меня есть подкласс UITableviewCell. В этой ячейке у меня есть 2 метки (lblComment и lblDateTimeStampe) и один вид, чтобы показать звезды рейтинга. Я хочу, чтобы динамическая высота lblComment соответствовала всему тексту. Он должен расширяться и сжиматься по высоте в зависимости от длины комментария. Я реализовал это раньше, но БЕЗ автозапуска, как показано ниже

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  {  

    NSString *label =  self.userComment.commentText;
    CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15]
                          constrainedToSize:CGSizeMake(320, 9999) 
                              lineBreakMode:UILineBreakModeWordWrap];

    return stringSize.height+10;

} 

Теперь я использую функцию AutoLayout.

Как я могу достичь этого, используя Autolayout?

Приветствуется всякая помощь. Благодаря

Ответ 1

К сожалению, автоматический макет не поможет вам с tableView:heightForRowAtIndexPath. Вы все равно должны реализовать этот метод.

Вы можете использовать метод UIView systemLayoutSizeFittingSize:, но это означает, что вам нужно создать экземпляр и настроить ячейку представления таблицы, которая может быть довольно дорогостоящей. Однако вы можете сохранить один за другим и повторно использовать его для расчетов. Но на данный момент вы действительно не сэкономите много с точки зрения усилий по разработке, поэтому делать вычисления, как вы делали раньше, это, вероятно, лучший/самый быстрый способ сделать это.

Ответ 2

Вы можете использовать свободно доступную среду Sensible TableView. Структура автоматически изменяет размеры ячеек по мере роста их содержимого. Он также делает это динамически, если представление таблицы уже отображается.

Ответ 3

Я применил решение той же проблемы с использованием autolayout, и оно работает.

Во-первых, вам нужно определить heightConstraint для lblComment.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UIFont *font = [UIFont fontWithName:@"YourFontName" size:YourFontSize] ;
UITextView *calculationView = [[UITextView alloc] init];
[calculationView setFont:font];
[calculationView setTextAlignment:NSTextAlignmentLeft];
[calculationView setText:lblComment.text];
int width = 0;
if(self.appDelegate.isDeviceiPhone)
    width = 284;
else
    width = 720;
CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)];
   return size.height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {
//initialize the cell..

UIFont *font = [UIFont fontWithName:@"YourFontName" size:YourFontSize];

UITextView *calculationView = [[UITextView alloc] init];
[calculationView setFont:font];
[calculationView setTextAlignment:NSTextAlignmentLeft];
[calculationView setText:cell.lblComment.text];

int width = 0;

if(self.appDelegate.isDeviceiPhone)
    width = 284;
else
    width = 720;

CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)];

cell.lblDetailHeightConstraint.constant = size.height;

// the other stuff...
}

Надеюсь, что это поможет.

Ответ 4

Если вы правильно настроите ограничения в IB, это должно сработать. Вам не нужно добавлять элементы программно, хотя, как вы сказали, это тоже будет работать.

Предполагая, что у вас есть label1 (переменная высота), label2 и view1 в таблице viewcell в этом порядке, вы должны:

  • Установите фиксированные ограничения высоты на ярлыке2 и view1
  • Поднимите нижнюю часть view1 в нижней части ячейки.
  • Вставьте вертикальный интервал вида1 и label2
  • Вставьте вертикальное расстояние между меткой2 и меткой 1
  • Вставьте верхний интервал метки1 в верхнюю часть ячейки.

Просто убедитесь, что у вас нет ограничения высоты на label1, если вы делаете это, оно должно быть больше или равно. С такой конфигурацией вы можете продолжить использование heightForRowAtIndexPath, а label1 будет расширяться и сокращаться вертикально в зависимости от высоты ячейки.