Как переносить текст в 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
.
Ответы
Ответ 1
Вот более простой способ, и он работает для меня:
Внутри вашей функции cellForRowAtIndexPath:
. Первый раз, когда вы создаете свою ячейку:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 0;
cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}
Вы заметите, что я установил количество строк для метки в 0. Это позволяет использовать столько строк, сколько нужно.
В следующей части указывается, насколько велика ваша UITableViewCell
, поэтому сделайте это в своей функции heightForRowAtIndexPath
:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *cellText = @"Go get some text for your cell.";
UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height + 20;
}
Я добавил 20 к моей возвращаемой высоте ячейки, потому что мне нравится небольшой буфер вокруг моего текста.
Ответ 2
Обновлен ответ Тима Рупе для 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;
}
Ответ 3
Краткий комментарий/ответ, чтобы записать мой опыт, когда у меня была такая же проблема. Несмотря на использование примеров кода, высота ячейки таблицы была настроена, но метка внутри ячейки по-прежнему не корректировалась правильно - решение заключалось в том, что я загружал свою ячейку из пользовательского файла NIB, что происходит после высота ячейки регулируется.
И у меня были настройки внутри файла NIB, чтобы не обертывать текст, и только 1 строка для метки; параметры файла NIB переопределяли настройки, которые я отрегулировал внутри кода.
Урок, который я взял, состоял в том, чтобы всегда иметь в виду, что состояние объектов в каждый момент времени - они, возможно, еще не были созданы!... кто-то на линии.
Ответ 4
Если мы хотим добавить только текст в ячейку 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"];
Ответ 5
Теперь в табличных представлениях могут быть ячейки для самостоятельной калибровки. Установите таблицу вверх следующим образом
tableView.estimatedRowHeight = 85.0 //use an appropriate estimate
tableView.rowHeight = UITableViewAutomaticDimension
Справочник Apple
Ответ 6
Я использую следующие решения.
Данные предоставляются отдельно в элементе:
-(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 в 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;
}
Ответ 7
Я нашел, что это довольно просто и прямолинейно:
[self.tableView setRowHeight:whatEvereight.0f];
например.
[self.tableView setRowHeight:80.0f];
Это может быть или не быть лучшим/стандартным подходом для этого, но он работал в моем случае.
Ответ 8
Я думаю, что это лучшее и более короткое решение. Просто отформатируйте 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;
}
Ответ 9
Я не думаю, что вы можете манипулировать базой UITableViewCell's
private UILabel
, чтобы сделать это. Вы могли бы добавить новый 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];