Динамическая высота ячейки таблицы с помощью 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 будет расширяться и сокращаться вертикально в зависимости от высоты ячейки.