Как мне перенести текст в UITableViewCell без пользовательской ячейки

StackOverflow https://stackoverflow.com/questions/129502

Вопрос

Это на 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.

Это было полезно?

Решение

Вот более простой способ, и он работает для меня:

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

Другие советы

Обновленный ответ Тима Рупа для 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 это изменяемый массив, из которого я получаю свои данные.

Редактировать :- Вот массив, который я взял.

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"];

Теперь tableviews могут содержать ячейки с собственным размером.Настройте табличный вид следующим образом

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

Ссылка на Apple

Я использую следующие решения.

Данные предоставляются отдельно в личном кабинете участника:

-(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;    
}

Я обнаружил, что это довольно просто и прямолинейно :

[self.tableView setRowHeight:whatEvereight.0f];

например, для:

[self.tableView setRowHeight:80.0f];

Это может быть, а может и не быть лучшим / стандартным подходом для этого, но в моем случае это сработало.

Попробуйте мой код на swift .Этот код также будет работать для обычных UILabels.

extension UILabel {
    func lblFunction() {
        //You can pass here all UILabel properties like Font, colour etc....
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Теперь звоните просто так

cell.textLabel.lblFunction()//Replace your label name 

Я думаю, что это лучшее и более короткое решение.Просто отформатируйте 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 Частное 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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top