Pergunta

Este é no iPhone 0S 2.0. Respostas para 2.1 são bons também, embora não tenho conhecimento de quaisquer diferenças em relação tabelas.

Parece que deve ser possível para obter o texto seja moldado sem criar uma célula personalizado, uma vez que um UITableViewCell contém uma UILabel por padrão. Eu sei que posso fazê-lo funcionar se eu criar uma célula de costume, mas isso não é o que eu estou tentando alcançar -. Eu quero entender por que minha abordagem atual não funciona

Eu descobri que o rótulo é criado sob demanda (uma vez que o acesso suportes célula de texto e imagem, para que ele não criar visualizar os dados até que seja necessário), então se eu fazer algo parecido com isto:

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

quando eu fico um rótulo válido, mas a definição numberOfLines em que (e lineBreakMode) não funciona - Ainda fico com texto de linha única. Há uma abundância de altura na UILabel para que o texto display -. Eu só estou retornando um grande valor para a altura em heightForRowAtIndexPath

Foi útil?

Solução

Aqui está uma maneira mais simples, e ele funciona para mim:

Dentro de sua função cellForRowAtIndexPath:. A primeira vez que você criar seu celular:

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

Você notará que eu definir o número de linhas para o rótulo para 0. Isso permite que ele use quantas linhas ele precisa.

A próxima parte é para especificar o tamanho da sua UITableViewCell será, então, fazer isso na sua função 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;
}

Eu adicionei 20 à minha altura da célula voltou porque eu como um pequeno tampão em torno de meu texto.

Outras dicas

Atualizado resposta de Tim Rupe para 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;
}

Um comentário breve / resposta para gravar a minha experiência quando eu tive o mesmo problema. Apesar de usar os exemplos de código, a altura da célula de exibição de tabela estava ajustando, mas o rótulo dentro da célula ainda não estava ajustando corretamente - solução foi que eu estava carregando meu celular a partir de um arquivo NIB personalizado, que acontece depois a altura da célula em ajustado.

E eu tinha minhas configurações dentro do arquivo NIB para não quebrar o texto, e só tem uma linha para a etiqueta; as configurações de arquivo nib foram substituindo as configurações I ajustadas dentro do código.

A lição que eu dava era para certificar-se de sempre ter em mente o que o estado dos objetos estão em cada ponto no tempo - eles não poderia ter sido criado ainda! ... hth alguém para baixo da linha.

Se quisermos adicionar apenas texto na célula UITableView, precisamos apenas dois delegados para trabalhar com (sem necessidade de adicionar UILabels adicional)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Esta solução funcionou para mim: -

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

Aqui a mutArr string é uma matriz mutável da qual eu estou recebendo meus dados.

EDIT: -. Aqui é a matriz que eu levei

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

Agora, os tableviews pode ter células auto-dimensionamento. Defina a exibição de tabela da seguinte forma

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

Apple Referência

Eu uso as seguintes soluções.

Os dados são fornecidos separadamente em um membro:

-(NSString *)getHeaderData:(int)theSection {
    ...
    return rowText;
}

O tratamento pode ser feito facilmente em cellForRowAtIndexPath. Definir a célula / definir a fonte e atribuir esses valores para o resultado "célula". Note que o numberoflines é definido como "0", que significa tomar o que é necessário.

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

Em heightForRowAtIndexPath, eu calcular as alturas do texto envolvido. O tamanho boding deve estar relacionada com a largura do seu celular. Para iPad esta será 1024. Para 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;    
}

Eu encontrei este para ser bastante simples e direta:

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

para e.g. :

[self.tableView setRowHeight:80.0f];

Isto pode ou não pode ser a melhor abordagem / padrão para fazê-lo, mas ele trabalhou no meu caso.

Tente meu código em Swift. Este código irá trabalhar para UILabels normais também.

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

Agora chamar simplesmente como este

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

Eu acho que esta é uma solução melhor e mais curto. Apenas formatar o UILabel (textLabel) da célula para cálculo automático para a altura especificando sizeToFit e tudo deve estar bem.

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

Eu não acho que você pode manipular um UITableViewCell's base de UILabel privada para fazer isso. Você pode adicionar um novo UILabel ao mesmo celular e uso numberOfLines com sizeToFit para dimensioná-lo adequadamente. Algo como:

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];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top