Как сделать Обтекание текстом в инструменту UITableViewCell без пользовательской ячейки
это на iPhone 0S 2.0. Ответы на 2.1 тоже хороши, хотя я не знаю никаких различий в отношении таблиц.
похоже, что должно быть возможно получить текст для переноса без создания пользовательской ячейки, так как UITableViewCell
содержит UILabel
по умолчанию. Я знаю, что могу заставить его работать, если создам пользовательскую ячейку, но это не то, чего я пытаюсь достичь - я хочу понять, почему мой текущий подход не работает.
я понял, что метка создается на спрос (поскольку ячейка поддерживает доступ к тексту и изображению, поэтому она не создает представление данных до необходимости), поэтому если я делаю что-то вроде этого:
cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];
тогда я получаю действительную метку, но установка numberOfLines
на этом (и lineBreakMode) не работает - я все еще получаю однострочный текст. Есть много высоты в UILabel
для отображения текста-я просто возвращаю большое значение для высоты в heightForRowAtIndexPath
.
9 ответов:
обновлен ответ Тима Рупе для iOS7:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; cell.textLabel.numberOfLines = 0; cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellText = @"Go get some text for your cell."; UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:cellText attributes:@ { NSFontAttributeName: cellFont }]; CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil]; return rect.size.height + 20; }
краткий комментарий / ответ, чтобы записать мой опыт, когда у меня была та же проблема. Несмотря на использование примеров кода, высота ячейки табличного представления корректировалась, но метка внутри ячейки все еще не корректировалась правильно-решение состояло в том, что я загружал свою ячейку из пользовательского файла NIB, что происходит после высота ячейки регулируется.
и у меня были настройки внутри файла NIB, чтобы не переносить текст, и только 1 строка для метки; настройки файла NIB были переопределение настроек, которые я настроил внутри кода.
если мы должны добавить только текст в
UITableView
ячейка, нам нужно только два делегата для работы (не нужно добавлять дополнительныеUILabels
)1)
cellForRowAtIndexPath
2)
heightForRowAtIndexPath
это решение работало для меня: -
строка-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16]; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; cell.textLabel.text = [mutArr objectAtIndex:indexPath.section]; NSLog(@"%@",cell.textLabel.text); cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGSize labelSize = CGSizeMake(200.0, 20.0); NSString *strTemp = [mutArr objectAtIndex:indexPath.section]; if ([strTemp length] > 0) labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap]; return (labelSize.height + 10); }
mutArr
- это изменяемый массив, из которого я получаю свои данные.EDIT : - вот массив, который я взял.
mutArr= [[NSMutableArray alloc] init]; [mutArr addObject:@"HEMAN"]; [mutArr addObject:@"SUPERMAN"]; [mutArr addObject:@"Is SUPERMAN powerful than HEMAN"]; [mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"]; [mutArr addObject:@"Where are BATMAN and SPIDERMAN"];
теперь табличные представления могут иметь ячейки с самостоятельным размером. Установите табличное представление следующим образом
tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension
Я использую следующие решения.
данные предоставляются отдельно в члене:
-(NSString *)getHeaderData:(int)theSection { ... return rowText; }
обработка может быть легко сделано в
cellForRowAtIndexPath
. Определите ячейку / определите шрифт и назначьте эти значения результирующей "ячейке". Обратите внимание, чтоnumberoflines
имеет значение "0", что означает взять то, что нужно.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0]; cell.textLabel.text= [self getRowData:indexPath.section]; cell.textLabel.font = cellFont; cell.textLabel.numberOfLines=0; return cell; }
на
heightForRowAtIndexPath
, я вычисляю высоту завернутого текста. Размер предвещающий должна относиться к ширине клетки. Для iPad это должно быть 1024. Для iPhone en iPod 320.- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0]; CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX); CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap]; return requiredSize.height; }
Я нашел это довольно простым и понятным :
[self.tableView setRowHeight:whatEvereight.0f];
, например :
[self.tableView setRowHeight:80.0f];
это может быть или не быть лучшим / стандартным подходом для этого, но он работал в моем случае.
Я думаю, что это лучшее и более короткое решение. Просто отформатируйте
UILabel
(textLabel
) ячейки для автоматического расчета высоты, указавsizeToFit
и все должно быть нормально.- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } // Configure the cell... cell.textLabel.text = @"Whatever text you want to put here is ok"; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; [cell.textLabel sizeToFit]; return cell; }
Я не думаю, что вы можете манипулировать базой
UITableViewCell's
privateUILabel
для этого. Вы можете добавить новыйUILabel
в ячейку себя и использоватьnumberOfLines
СsizeToFit
чтобы определить его размер соответствующим образом. Что-то вроде:UILabel* label = [[UILabel alloc] initWithFrame:cell.frame]; label.numberOfLines = <...an appriate number of lines...> label.text = <...your text...> [label sizeToFit]; [cell addSubview:label]; [label release];