Question

Ceci est sur iPhone 0S 2.0. Les réponses pour la version 2.1 sont également acceptables, même si je ne connais aucune différence entre les tableaux.

Il semble qu'il devrait être possible de mettre du texte à la ligne sans créer de cellule personnalisée, car un UITableViewCell contient un UILabel par défaut. Je sais que je peux le faire fonctionner si je crée une cellule personnalisée, mais ce n’est pas ce que j’essaie d’obtenir - je veux comprendre pourquoi mon approche actuelle ne fonctionne pas.

J'ai découvert que l'étiquette était créée à la demande (étant donné que la cellule prend en charge l'accès au texte et aux images, elle ne crée donc pas la vue des données avant qu'elle ne soit nécessaire). Par conséquent, si je fais quelque chose comme ceci:

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

alors je reçois une étiquette valide, mais régler numberOfLines sur cela (et lineBreakMode) ne fonctionne pas - je reçois toujours du texte d'une seule ligne. UILabel est assez haut pour le texte à afficher - je ne fais que renvoyer une valeur importante pour la hauteur dans heightForRowAtIndexPath .

Était-ce utile?

La solution

Voici un moyen plus simple, et cela fonctionne pour moi:

Dans votre fonction cellForRowAtIndexPath: . La première fois que vous créez votre cellule:

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

Vous remarquerez que je règle le nombre de lignes de l'étiquette sur 0. Cela lui permet d'utiliser autant de lignes que nécessaire.

La prochaine partie consiste à spécifier la taille de votre UITableViewCell , faites-le dans votre 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;
}

J'ai ajouté 20 à la hauteur de ma cellule renvoyée parce que j'aime bien mettre un peu de mémoire tampon autour de mon texte.

Autres conseils

Mise à jour de la réponse de Tim Rupe pour 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;
}

Un bref commentaire / réponse pour enregistrer mon expérience lorsque j'ai eu le même problème. Malgré l'utilisation des exemples de code, la hauteur de la cellule sous forme de tableau était en train de s'ajuster, mais l'étiquette à l'intérieur de la cellule ne s'ajustait toujours pas correctement. La solution était que je chargeais ma cellule à partir d'un fichier NIB personnalisé, ce qui se produit après . la hauteur de la cellule est ajustée.

Et j'avais mes paramètres dans le fichier NIB pour ne pas envelopper le texte, et n'avoir qu'une seule ligne pour l'étiquette; les paramètres du fichier NIB remplaçaient ceux que j’avais réglés dans le code.

La leçon que j’ai suivie est de veiller à toujours garder à l’esprit l’état des objets à chaque instant - ils n’ont peut-être pas encore été créés! ... Quelqu'un au bout de la ligne.

Si nous voulons ajouter uniquement du texte dans la cellule UITableView , il ne faut que deux délégués avec lesquels travailler (il n'est pas nécessaire d'ajouter UILabels )

.

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Cette solution a fonctionné pour moi: -

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

Ici, la chaîne mutArr est un tableau mutable à partir duquel je récupère mes données.

EDIT: - voici le tableau que j'ai pris.

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

Maintenant, les vues de table peuvent avoir des cellules à taille automatique. Définissez la vue de table comme suit

tableView.estimatedRowHeight = 85.0 // utilise une estimation appropriée tableView.rowHeight = UITableViewAutomaticDimension

Référence Apple

J'utilise les solutions suivantes.

Les données sont fournies séparément dans un membre:

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

La gestion peut être facilement effectuée dans cellForRowAtIndexPath . Définissez la cellule / définissez la police et affectez ces valeurs au résultat "cellule". Notez que le numberoflines est défini sur "0", ce qui signifie prendre ce qui est nécessaire.

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

Dans heightForRowAtIndexPath , je calcule les hauteurs du texte enveloppé. La taille de boding doit être liée à la largeur de votre cellule. Pour iPad, ce sera 1024. Pour iPhone et 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;    
}

J'ai trouvé que c'était assez simple et direct:

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

par exemple :

[self.tableView setRowHeight:80.0f];

Cette approche peut ou non être la meilleure / standard pour le faire, mais cela a fonctionné dans mon cas.

Essayez mon code rapidement. Ce code fonctionnera également pour les étiquettes UIL normales.

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

Appelez simplement comme ceci

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

Je pense que cette solution est meilleure et plus courte. Formatez simplement le UILabel ( textLabel ) de la cellule à calculer automatiquement pour la hauteur en spécifiant sizeToFit et tout devrait bien se passer.

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

Je ne pense pas que vous puissiez manipuler un UITableViewCell privé UILabel de base. Vous pouvez ajouter vous-même un nouveau UILabel à la cellule et utiliser numberOfLines avec sizeToFit pour le dimensionner correctement. Quelque chose comme:

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];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top