Я использую пользовательский UITableViewCell, который имеет некоторые метки, кнопки и изображения для отображения. В ячейке есть одна метка, текст которой является NSString
объектом, а длина строки может быть переменной. В связи с этим, я не могу установить высоту константы ячейки в UITableView
«s heightForCellAtIndex
метода. Высота ячейки зависит от высоты этикетки , которая может быть определена с помощью NSString
«S sizeWithFont
метода. Я пытался использовать его, но, похоже, я где-то ошибаюсь. Как это можно исправить?
Вот код, используемый для инициализации ячейки.
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier])
{
self.selectionStyle = UITableViewCellSelectionStyleNone;
UIImage *image = [UIImage imageNamed:@"dot.png"];
imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(45.0,10.0,10,10);
headingTxt = [[UILabel alloc] initWithFrame: CGRectMake(60.0,0.0,150.0,post_hdg_ht)];
[headingTxt setContentMode: UIViewContentModeCenter];
headingTxt.text = postData.user_f_name;
headingTxt.font = [UIFont boldSystemFontOfSize:13];
headingTxt.textAlignment = UITextAlignmentLeft;
headingTxt.textColor = [UIColor blackColor];
dateTxt = [[UILabel alloc] initWithFrame:CGRectMake(55.0,23.0,150.0,post_date_ht)];
dateTxt.text = postData.created_dtm;
dateTxt.font = [UIFont italicSystemFontOfSize:11];
dateTxt.textAlignment = UITextAlignmentLeft;
dateTxt.textColor = [UIColor grayColor];
NSString * text1 = postData.post_body;
NSLog(@"text length = %d",[text1 length]);
CGRect bounds = [UIScreen mainScreen].bounds;
CGFloat tableViewWidth;
CGFloat width = 0;
tableViewWidth = bounds.size.width/2;
width = tableViewWidth - 40; //fudge factor
//CGSize textSize = {width, 20000.0f}; //width and height of text area
CGSize textSize = {245.0, 20000.0f}; //width and height of text area
CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:11.0f]
constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];
CGFloat ht = MAX(size1.height, 28);
textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
textView.text = postData.post_body;
textView.font = [UIFont systemFontOfSize:11];
textView.textAlignment = UITextAlignmentLeft;
textView.textColor = [UIColor blackColor];
textView.lineBreakMode = UILineBreakModeWordWrap;
textView.numberOfLines = 3;
textView.autoresizesSubviews = YES;
[self.contentView addSubview:imageView];
[self.contentView addSubview:textView];
[self.contentView addSubview:webView];
[self.contentView addSubview:dateTxt];
[self.contentView addSubview:headingTxt];
[self.contentView sizeToFit];
[imageView release];
[textView release];
[webView release];
[dateTxt release];
[headingTxt release];
}
Это метка, высота и ширина которой неправильны:
textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
источник
Если все ваши строки имеют одинаковую высоту, просто установите
rowHeight
свойство UITableView, а не реализуйтеheightForRowAtIndexPath
. Документы Apple:источник
tableView.rowHeight
установлено,heightForRowAtIndexPath
не будет вызываться, если вы пытаетесь выяснить, почему (как я).в пользовательском UITableViewCell -controller добавить это
В UITableView -контроллере добавьте это
источник
источник
источник
Я видел много решений, но все было неправильно или не завершено. Вы можете решить все проблемы с 5 строками в viewDidLoad и autolayout. Это для объективного C:
Для Swift 2.0:
Теперь создайте свою ячейку с xib или в виде таблицы в раскадровке. С этим вам не нужно ничего реализовывать или переопределять. (Не забудьте номера строк 0) и нижний ярлык (ограничьте) понизьте "Приоритет удержания контента - по вертикали до 250"
Вы можете загрузить код по следующему адресу: https://github.com/jposes22/exampleTableCellCustomHeight.
источник
Чтобы установить автоматическое измерение для высоты строки и предполагаемой высоты строки, выполните следующие шаги, чтобы автоматическое измерение было эффективным для макета высоты ячейки / строки.
UITableViewAutomaticDimension
rowHeight & оценкаRowHeightheightForRowAt
и верните ему значениеUITableViewAutomaticDimension
)-
Цель C:
Swift:
Для экземпляра метки в UITableviewCell
Примечание . Если у вас более одной метки (UIElements) с динамической длиной, которую следует отрегулировать в соответствии с размером ее содержимого: настройте «Приоритет содержания и сопротивления сжатию» для меток, которые вы хотите расширить / сжать с более высоким приоритетом.
Здесь, в этом примере, я установил низкий приоритет объятий и высокий уровень сопротивления сжатию, что приводит к увеличению приоритета / важности содержимого второй (желтой) метки.
источник
Благодаря всем сообщениям на эту тему, есть несколько действительно полезных способов отрегулировать rowHeight UITableViewCell.
Вот компиляция некоторых концепций от всех остальных, которые действительно помогают при создании для iPhone и iPad. Вы также можете получить доступ к различным разделам и настроить их в соответствии с различными размерами просмотров.
источник
Чтобы иметь динамическую высоту ячейки при увеличении текста метки, сначала нужно вычислить высоту, которую текст будет использовать в
-heightForRowAtIndexPath
методе делегата, и вернуть ее с добавленной высотой других меток, изображений (максимальная высота текста + высота других статических объектов. componentenets) и использовать ту же высоту при создании ячейки.источник