Ajustez la hauteur UILabel en fonction du texte


315

Considérez que j'ai le texte suivant dans un UILabel(une longue ligne de texte dynamique):

Étant donné que l'armée extraterrestre surpasse largement l'équipe, les joueurs doivent utiliser le monde post-apocalyptique à leur avantage, comme chercher une couverture derrière des bennes à ordures, des piliers, des voitures, des décombres et d'autres objets.

Je veux redimensionner la UILabel'shauteur pour que le texte puisse tenir. J'utilise les propriétés suivantes de UILabelpour faire en sorte que le texte soit enveloppé.

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

Veuillez me faire savoir si je ne vais pas dans la bonne direction. Merci.



Version
Juan Boero

Réponses:


409

sizeWithFont constrainedToSize:lineBreakMode:est la méthode à utiliser. Un exemple de la façon de l'utiliser est ci-dessous:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

Cela utilise 9999, comment le feriez-vous flexible au texte?
quantumpotato

1
@quantumpotato 9999 est juste un espace réservé pour l'espace maximum que le texte est autorisé à occuper. Vous pouvez utiliser n'importe quel numéro qui fonctionne pour votre interface utilisateur.
PyjamaSam

9
Si vous dimensionnez vos étiquettes comme ceci, vous vous trompez . Vous devez utiliser [label sizeToFit].
Marián Černý

5
N'oubliez pas que sizeWithFontc'est obsolète dans iOS 7. stackoverflow.com/questions/18897896/…
attomos

7
Son obsolète;
msmq

242

Vous alliez dans la bonne direction. Il vous suffit de:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];

5
La taille pour s'adapter était exactement ce dont j'avais besoin pour que le texte soit enveloppé, longtemps avec myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0;
Jack BeNimble

2
Une solution beaucoup plus facile que la réponse marquée comme correcte et fonctionne aussi bien.
memmons

4
@Inder Kumar Rathore - J'utilise cela pour plusieurs lignes, tout le temps, d'où le numberOfLines = 0; Je suppose qu'il manque d'abord la définition de la largeur préférée, mais j'ai supposé que cela avait déjà été fait avec l'init de l'UILabel.
DonnaLea

@Donna .. Je n'ai pas votre préférence avec .. parlez-vous de son cadre ??
Inder Kumar Rathore

@DonnaLea, Merci beaucoup. votre approche simple de la solution m'a également aidé à résoudre mon problème.
Naved

44

Dans iOS 6, Apple a ajouté une propriété à UILabel qui simplifie considérablement le redimensionnement vertical dynamique des étiquettes: PreferredMaxLayoutWidth .

L'utilisation de cette propriété en combinaison avec lineBreakMode = NSLineBreakByWordWrapping et la méthode sizeToFit permet de redimensionner facilement une instance UILabel à la hauteur qui contient tout le texte.

Une citation de la documentation iOS:

favoriteMaxLayoutWidth La largeur maximale préférée (en points) pour une étiquette multiligne.

Discussion Cette propriété affecte la taille de l'étiquette lorsque des contraintes de disposition lui sont appliquées. Pendant la mise en page, si le texte dépasse la largeur spécifiée par cette propriété, le texte supplémentaire est acheminé vers une ou plusieurs nouvelles lignes, augmentant ainsi la hauteur de l'étiquette.

Un échantillon:

...
UILabel *status = [[UILabel alloc] init];
status.lineBreakMode = NSLineBreakByWordWrapping;
status.numberOfLines = 5; // limits to 5 lines; use 0 for unlimited.

[self addSubview:status]; // self here is the parent view

status.preferredMaxLayoutWidth = self.frame.size.width; // assumes the parent view has its frame already set.

status.text = @"Some quite lengthy message may go here…";
[status sizeToFit];
[status setNeedsDisplay];
...

39

Vérifiez parfaitement ce travail sans ajouter une seule ligne de code. (Utilisation de la mise en page automatique)

J'ai fait une démo pour vous selon vos besoins. Téléchargez-le à partir du lien ci-dessous,

Redimensionner automatiquement UIView et UILabel

Guide étape par étape: -

Étape 1 :- Réglez la contrainte sur UIView

1) En tête 2) En haut 3) En fin de ligne (vue principale)

entrez la description de l'image ici

Étape 2: - Définissez la contrainte sur l'étiquette 1

1) En tête 2) Top 3) En fin de ligne (De sa vue d'ensemble)

entrez la description de l'image ici

Étape 3: - Définissez la contrainte sur l'étiquette 2

1) Interlignage 2) Trailing (de sa vue d'ensemble)

entrez la description de l'image ici

Étape 4: - Donner le plus difficile à UILabel de UIView.

entrez la description de l'image ici

Étape 5: - (Facultatif) Définissez la contrainte sur UIButton

1) avant 2) bas 3) arrière 4) hauteur fixe (vue principale)

entrez la description de l'image ici

Production :-

entrez la description de l'image ici

Remarque: - Assurez-vous que vous avez défini Nombre de lignes = 0 dans la propriété Label.

entrez la description de l'image ici

J'espère que ces informations suffisent pour comprendre Autoresize UIView selon la hauteur de UILabel et Autoresize UILabel selon le texte.


Et si vous souhaitez également avoir des vues sous la vue sur fond blanc? Ne pas lui donner de hauteur affichera quelques lignes rouges dans SB pour "Besoin de contraintes pour: position ou hauteur Y"
Bogdan Razvan

cela doit être marqué comme la bonne réponse. C'est la bonne façon avec ib.
Rana Tallal

@ SPQR3 quel est le problème? cela a aidé beaucoup de gens et cela fonctionne bien.
Badal Shah

36

Au lieu de cela, par programmation, vous pouvez le faire dans Storyboard / XIB lors de la conception.

  • Définissez la propriété number of lines d' UIlabel sur 0 dans l'inspecteur d'attributs.
  • Ensuite, définissez la contrainte de largeur / (ou) la contrainte de début et de fin selon l'exigence.
  • Définissez ensuite la contrainte de hauteur avec une valeur minimale . Enfin, sélectionnez la contrainte de hauteur que vous avez ajoutée et, dans l'inspecteur de taille, à côté de l'inspecteur d'attribut, changez la relation de la contrainte de hauteur de égale à - supérieure à .

Celui-ci fonctionne pour UILabel incorporé dans une cellule xib personnalisée dans un UITableView.
Gang Fang

Selon votre réponse, j'ai défini une hauteur constante pour mon étiquette et défini cette priorité sur Faible (250) et les erreurs disparaissent. (Pas besoin de définir égal à - supérieur à)
Hamid Reza Ansari

15

Merci les gars pour votre aide, voici le code que j'ai essayé et qui fonctionne pour moi

   UILabel *instructions = [[UILabel alloc]initWithFrame:CGRectMake(10, 225, 300, 180)];
   NSString *text = @"First take clear picture and then try to zoom in to fit the ";
   instructions.text = text;
   instructions.textAlignment = UITextAlignmentCenter;
   instructions.lineBreakMode = NSLineBreakByWordWrapping;
   [instructions setTextColor:[UIColor grayColor]];

   CGSize expectedLabelSize = [text sizeWithFont:instructions.font 
                                constrainedToSize:instructions.frame.size
                                    lineBreakMode:UILineBreakModeWordWrap];

    CGRect newFrame = instructions.frame;
    newFrame.size.height = expectedLabelSize.height;
    instructions.frame = newFrame;
    instructions.numberOfLines = 0;
    [instructions sizeToFit];
    [self addSubview:instructions];

2
sizeWithFont est obsolète.
msmq

12

Solution à iOS7 antérieure et iOS7 ci-dessus

//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import <UIKit/UIKit.h>

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define iOS7_0 @"7.0"

@interface UILabel (DynamicHeight)

/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */

-(CGSize)sizeOfMultiLineLabel;

@end


//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import "UILabel+DynamicHeight.h"

@implementation UILabel (DynamicHeight)
/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */
-(CGSize)sizeOfMultiLineLabel{

    NSAssert(self, @"UILabel was nil");

    //Label text
    NSString *aLabelTextString = [self text];

    //Label font
    UIFont *aLabelFont = [self font];

    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;


    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
        //version < 7.0

        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
    }
    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
        //version >= 7.0

        //Return the calculated size of the Label
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;

    }

    return [self bounds].size;

}

@end

Dans la sous-classe UITableViewController, où dois-je appeler cette méthode?
Homam

Où vous souhaitez calculer la hauteur de l'étiquette, appelez cette méthode. puis ajustez la hauteur de la vue de table. où vous avez la hauteur de table pour la ligne à la méthode d'index. calculer tous les textes d'étiquettes verticales selon vos besoins
Vijay-Apple-Dev.blogspot.com

Vijay sizeWithFont est déprécié.
user3182143

10

Puisque sizeWithFont est obsolète, j'utilise celui-ci à la place.

celui-ci obtient des attributs spécifiques à l'étiquette.

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text{

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName:label.font}];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){label.frame.size.width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];

    return ceil(rect.size.height);
}

6

Voici une version catégorie:

UILabel + AutoSize.h #import

@interface UILabel (AutoSize)

- (void) autosizeForWidth: (int) width;

@end

UILabel + AutoSize.m

#import "UILabel+AutoSize.h"

@implementation UILabel (AutoSize)

- (void) autosizeForWidth: (int) width {
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    CGSize maximumLabelSize = CGSizeMake(width, FLT_MAX);
    CGSize expectedLabelSize = [self.text sizeWithFont:self.font constrainedToSize:maximumLabelSize lineBreakMode:self.lineBreakMode];
    CGRect newFrame = self.frame;
    newFrame.size.height = expectedLabelSize.height;
    self.frame = newFrame;
}

@end

6

Vous pouvez implémenter la TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath méthode de la manière suivante (par exemple):

#define CELL_LABEL_TAG 1

- (UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = @"my long text";

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:identifier] autorelease];
    }

    CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
    CGFloat height = [self textHeight:text] + 10;
    CGRect frame = CGRectMake(10.0f, 10.0f, width, height);

    UILabel *cellLabel = [[UILabel alloc] initWithFrame:frame];
    cellLabel.tag = CELL_LABEL_TAG;
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.textAlignment = UITextAlignmentLeft;
    cellLabel.font = [UIFont systemFontOfSize:12.0f];
    [cell.contentView addSubview:cellLabel];
    [cellLabel release];

    return cell;
}

UILabel *label = (UILabel *)[cell viewWithTag:CELL_LABEL_TAG];
label.text = text;
label.numberOfLines = 0;
[label sizeToFit];
return cell;

Utilisez également NSStringla sizeWithFont:constrainedToSize:lineBreakMode:méthode de pour calculer la hauteur du texte.


6

Extension UILabel basée sur cette réponse pour Swift 4 et supérieur

extension UILabel {

    func retrieveTextHeight () -> CGFloat {
        let attributedText = NSAttributedString(string: self.text!, attributes: [NSFontAttributeName:self.font])

        let rect = attributedText.boundingRect(with: CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

        return ceil(rect.size.height)
    }

}

Peut être utilisé comme:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()

4

Et pour ceux qui migrent vers iOS 8, voici une extension de classe pour Swift:

extension UILabel {

    func autoresize() {
        if let textNSString: NSString = self.text {
            let rect = textNSString.boundingRectWithSize(CGSizeMake(self.frame.size.width, CGFloat.max),
                options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: self.font],
                context: nil)
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, rect.height)
        }
    }

}

4

Le moyen le plus simple et le plus efficace pour moi a été d'appliquer une contrainte de hauteur à l'étiquette et de définir la priorité sur faible , c'est-à-dire (250) dans le storyboard.

Vous n'avez donc pas à vous soucier de calculer la hauteur et la largeur par programme, grâce au storyboard.


4

Mon approche pour calculer la hauteur dynamique de UILabel.

    let width = ... //< width of this label 
    let text = ... //< display content

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.preferredMaxLayoutWidth = width

    // Font of this label.
    //label.font = UIFont.systemFont(ofSize: 17.0)
    // Compute intrinsicContentSize based on font, and preferredMaxLayoutWidth
    label.invalidateIntrinsicContentSize() 
    // Destination height
    let height = label.intrinsicContentSize.height

Envelopper pour fonctionner:

func computeHeight(text: String, width: CGFloat) -> CGFloat {
    // A dummy label in order to compute dynamic height.
    let label = UILabel()

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = UIFont.systemFont(ofSize: 17.0)

    label.preferredMaxLayoutWidth = width
    label.text = text
    label.invalidateIntrinsicContentSize()

    let height = label.intrinsicContentSize.height
    return height
}

3

Méthode mise à jour

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {

    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;

    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}

3

Ceci est une ligne de code pour obtenir la hauteur UILabel en utilisant Objective-c:

labelObj.numberOfLines = 0;
CGSize neededSize = [labelObj sizeThatFits:CGSizeMake(screenWidth, CGFLOAT_MAX)];

et en utilisant .height, vous obtiendrez la hauteur de l'étiquette comme suit:

neededSize.height

Meilleure réponse actuelle.
Mike

3

Vous pouvez obtenir la hauteur en utilisant le code ci-dessous

Vous devez passer

  1. texte 2. police 3. largeur d'étiquette

    func heightForLabel(text: String, font: UIFont, width: CGFloat) -> CGFloat {
    
       let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
       label.numberOfLines = 0
       label.lineBreakMode = NSLineBreakMode.byWordWrapping
       label.font = font
       label.text = text
       label.sizeToFit()
    
       return label.frame.height
    }

2

Merci pour ce post. Cela m'a beaucoup aidé. Dans mon cas, je modifie également le texte dans un contrôleur de vue séparé. J'ai remarqué que lorsque j'utilise:

[cell.contentView addSubview:cellLabel];

dans la tableView: cellForRowAtIndexPath: méthode selon laquelle la vue d'étiquette était continuellement rendue au-dessus de la vue précédente chaque fois que je modifiais la cellule. Le texte est devenu pixélisé et lorsque quelque chose a été supprimé ou modifié, la version précédente était visible sous la nouvelle version. Voici comment j'ai résolu le problème:

if ([[cell.contentView subviews] count] > 0) {
    UIView *test = [[cell.contentView subviews] objectAtIndex:0];
    [test removeFromSuperview];
}
[cell.contentView insertSubview:cellLabel atIndex:0];

Plus de superposition bizarre. S'il existe une meilleure façon de gérer cela, faites-le moi savoir.


2
UILabel *itemTitle = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 10,100, 200.0f)];
itemTitle.text = @"aseruy56uiytitfesh";
itemTitle.adjustsFontSizeToFitWidth = NO;
itemTitle.autoresizingMask = UIViewAutoresizingFlexibleWidth;
itemTitle.font = [UIFont boldSystemFontOfSize:18.0];
itemTitle.textColor = [UIColor blackColor];
itemTitle.shadowColor = [UIColor whiteColor];
itemTitle.shadowOffset = CGSizeMake(0, 1);
itemTitle.backgroundColor = [UIColor blueColor];
itemTitle.lineBreakMode = UILineBreakModeWordWrap;
itemTitle.numberOfLines = 0;
[itemTitle sizeToFit];
[self.view addSubview:itemTitle];

utilisez ceci ici toutes les propriétés sont utilisées sur l'étiquette et testez-la en augmentant le texte dans le itemTitle.text comme

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

il montrera la réponse parfaite comme vous avez besoin


2

Vous pouvez également l'utiliser comme méthode. @Pyjamasam est tout à fait vrai, donc je fais juste sa méthode. Cela peut être utile pour quelqu'un d'autre

-(CGRect)setDynamicHeightForLabel:(UILabel*)_lbl andMaxWidth:(float)_width{
    CGSize maximumLabelSize = CGSizeMake(_width, FLT_MAX);

    CGSize expectedLabelSize = [_lbl.text sizeWithFont:_lbl.font constrainedToSize:maximumLabelSize lineBreakMode:_lbl.lineBreakMode];

    //adjust the label the the new height.
    CGRect newFrame = _lbl.frame;
    newFrame.size.height = expectedLabelSize.height;
    return newFrame;
}

et le mettre comme ça

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];

2

Pour ce faire dans Swift3, voici le code:

 let labelSizeWithFixedWith = CGSize(width: 300, height: CGFloat.greatestFiniteMagnitude)
            let exactLabelsize = self.label.sizeThatFits(labelSizeWithFixedWith)
            self.label.frame = CGRect(origin: CGPoint(x: 20, y: 20), size: exactLabelsize)

2

Ajout aux réponses ci-dessus:

Cela peut être facilement réalisé via le storyboard.

  1. Définir la contrainte pour UILabel. (Dans mon cas, j'ai fait le haut, la gauche et la largeur fixe)
  2. Définir le nombre de lignes sur 0 dans l'inspecteur d'attributs
  3. Définissez le saut de ligne sur WordWrap dans l'inspecteur d'attributs.

UILabel Height Adjust


1

Une ligne est la réponse de Chris est fausse.

newFrame.size.height = maximumLabelSize.height;

devrait être

newFrame.size.height = expectedLabelSize.height;

A part ça, c'est la bonne solution.


1

Enfin, cela a fonctionné. Merci les gars.

Je ne le faisais pas fonctionner parce que j'essayais de redimensionner l'étiquette dans la heightForRowAtIndexPathméthode:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

et (ouais idiot moi), je redimensionnais l'étiquette par défaut dans la cellForRowAtIndexPathméthode - je négligeais le code que j'avais écrit plus tôt:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

1
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellIdentifier = @"myCell";
    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.myUILabel.lineBreakMode = UILineBreakModeWordWrap;        
    cell.myUILabel.numberOfLines = 0;
    cell.myUILabel.text = @"Some very very very very long text....."
    [cell.myUILabel.criterionDescriptionLabel sizeToFit];    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat rowHeight = cell.myUILabel.frame.size.height + 10;

    return rowHeight;    
}

2
Pouvez-vous ajouter quelques explications sur la façon dont votre solution résout le problème du PO?

1
vous ne pouvez pas demander à UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; in heightForRowAtIndexPath, vous effectuerez une boucle infinie
Peter Lapisu

1
NSString *str = @"Please enter your text......";
CGSize lblSize = [str sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize: CGSizeMake(200.0f, 600.0f) lineBreakMode: NSLineBreakByWordWrapping];

UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(60, 20, 200, lblSize.height);
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.font = [UIFont systemFontOfSize:15];
label.text = str;
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
[self.view addSubview:label];

1

Mon code:

UILabel *label      = [[UILabel alloc] init];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.text          = text;
label.textAlignment = NSTextAlignmentCenter;
label.font          = [UIFont fontWithName:_bodyTextFontFamily size:_bodyFontSize];

CGSize size = [label sizeThatFits:CGSizeMake(width, MAXFLOAT)];


float height        = size.height;
label.frame         = CGRectMake(x, y, width, height);

1

Cette méthode donnera une hauteur parfaite

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;


title_size = [text boundingRectWithSize:constraint
                                options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{ NSFontAttributeName : font }
                                context:nil].size;

totalHeight = ceil(title_size.height);

CGFloat height = MAX(totalHeight, 40.0f);
return height;
}

Ne copiez pas le contenu d'ailleurs sans attribution claire. Il est considéré comme du plagiat. Voir stackoverflow.com/help/referencing ( stackoverflow.com/a/25158206/444991 ).
Matt

1

Swift 2:

    yourLabel.text = "your very long text"
    yourLabel.numberOfLines = 0
    yourLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    yourLabel.frame.size.width = 200
    yourLabel.frame.size.height = CGFloat(MAXFLOAT)
    yourLabel.sizeToFit()

Les lignes intéressantes sont sizeToFit()en conjonction avec le réglage de a frame.size.heightau flottant max, cela donnera de la place pour le texte long, mais sizeToFit()le forcera à n'utiliser que le nécessaire, mais TOUJOURS l' appeler après avoir réglé le .frame.size.height.

Je recommande de définir un .backgroundColorà des fins de débogage, de cette façon, vous pouvez voir le cadre rendu pour chaque cas.


1
yourLabel.frame.heightest une propriété exclusive
Phil Hudson

2
yourLabel.frame.size.width et yourLabel.frame.size.height sont également en lecture seule
CalZone

1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

Veuillez définir des contraintes pour UILable dans le storyboard, y compris en haut à gauche en bas à droite

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.