web-dev-qa-db-fra.com

Comment calculer la hauteur UILabel dynamiquement

J'ai le code suivant:

label.numberOfLines = 0; // allows label to have as many lines as needed
label.text = @"some long text";
[label sizeToFit];

Comment obtenir la hauteur de l'étiquette en points?

19
cdub

Utilisez la méthode suivante pour calculer la hauteur UILabel dynamique:

- (CGFloat)getLabelHeight:(UILabel*)label
{
    CGSize constraint = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);
    CGSize size;

    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize boundingBox = [label.text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:label.font}
                                                  context:context].size;

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

    return size.height;
}
53
Salman Zaidi

La façon la plus simple d'obtenir la hauteur est sizeThatFits. Utilisez-le comme ceci:

Objectif c

CGFloat maxLabelWidth = 100;
CGSize neededSize = [label sizeThatFits:CGSizeMake(maxLabelWidth, CGFLOAT_MAX)];

Swift 3.0

let maxLabelWidth: CGFloat = 100
let neededSize = label.sizeThatFits(CGSize(width: maxLabelWidth, height: CGFloat.greatestFiniteMagnitude))

La hauteur dont votre étiquette a besoin est neededSize.height.
Notez que j'utilise CGFLOAT_MAX pour la taille de taille, pour vous assurer que l'étiquette a suffisamment de place pour tenir dans le CGSize.

La hauteur de votre étiquette dépend également de la largeur de votre étiquette, c'est pourquoi j'ai ajouté maxLabelWidth, cela fait une différence si l'étiquette peut avoir une largeur de 100 pt ou 200 pt.

J'espère que cela t'aides!

Edit: Assurez-vous de définir label.numberOfLines = 0; sinon neededSize renvoie la taille où le texte est sur une seule ligne.

Edit: Ajouté Swift, bien que la dénomination soit un peu bizarre, la plus grandeFiniteMagnitude semble être l'équivalent correct pour CGFLOAT_MAX.

53
Fabio Berger

Utilisez simplement [label sizeThatFits:label.frame.size]; et il renverra la taille de l'étiquette qui conviendra au texte donné. Ou vous pouvez également suivre la question

6
iHulk

Pour ceux qui souhaitent estimer la taille d'une étiquette dans une méthode qui estime la hauteur de l'en-tête/cellule dans UICollectionView ou UITableView, procédez comme suit:

  1. Définissez la largeur maximale que prendra votre étiquette
  2. Créez un nouveau UILabel et définissez numberOfLines à 0
  3. Ajouter des attributs de police comme le nom et la taille de police personnalisés si vous utilisez des polices personnalisées
  4. Définissez le texte de cette étiquette et obtenez une hauteur estimée à l'aide de sizeThatFits. La hauteur de l'étiquette est neededHeight.height

Swift Version

let maxLabelWidth:CGFloat = collectionView.frame.width - 20
let label = UILabel()
label.numberOfLines = 0
let addressFont = [ NSFontAttributeName: UIFont(name: "OpenSans", size: 12.0)! ]
let addr = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
label.attributedText = NSMutableAttributedString(string: addr , attributes: addressFont )
let neededSize:CGSize = label.sizeThatFits(CGSizeMake(maxLabelWidth, CGFloat.max))
let labelHeight = neededSize.height

Merci à @FabioBerger

6
kishorer747

Vous pouvez créer une étiquette de manière dynamique:

-(CGRect)newLableSize:(NSString *)lableString
{
     NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
     [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];

        CGFloat tempwidth = YourStaticLabelWidth * ScreenWidth / 320;
        NSMutableArray *array=[[NSMutableArray alloc]initWithObjects: lableString,nil];
       CGRect newLabelsize = [[array objectAtIndex:0] boundingRectWithSize:CGSizeMake(tempwidth, MAXFLOAT)  options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:selectFont,NSParagraphStyleAttributeName:paragraphStyle} context:nil];   

        NSLog(@"New Label Size Width  : %f",newLabelsize.size.width);
        NSLog(@"New Label Size Height : %f",newLabelsize.size.height);

        return newLabelsize;
}
2
sohil

J'ai un peu édité la réponse de Salman Zaidi pour qu'elle fonctionne mieux pour moi. Cela fonctionne bien si vous n'avez pas d'accès direct à une étiquette, comme lorsque vous essayez d'obtenir la hauteur d'étiquette dans heightForRowAtIndexPath:

-(CGFloat)getLabelHeight:(CGSize)labelSize string: (NSString *)string font: (UIFont *)font{

    CGSize size;

    NSStringDrawingContext *context = [[NSStringDrawingContext alloc] init];
    CGSize boundingBox = [string boundingRectWithSize:labelSize
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:context].size;

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

    return size.height;
}
2
Shayno
- (CGFloat)getTextHeightByWidth:(NSString*)text textFont:(UIFont*)textFont textWidth:(float)textWidth {

    if (!text) {
        return 0;
    }
    CGSize boundingSize = CGSizeMake(textWidth, CGFLOAT_MAX);
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{ NSFontAttributeName: textFont }];

    CGRect rect = [attributedText boundingRectWithSize:boundingSize options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    CGSize requiredSize = rect.size;
    return requiredSize.height;
}

- (CGFloat)getTextWidthByHeight:(NSString*)text textFont:(UIFont*)textFont textHeight:(float)textHeight {

    if (!text) {
        return 0.0f;
    }
    CGSize boundingSize = CGSizeMake(CGFLOAT_MAX, textHeight);

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text
                                                                         attributes:@{ NSFontAttributeName: textFont }];

    CGRect rect = [attributedText boundingRectWithSize:boundingSize
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    CGSize requiredSize = rect.size;
    return requiredSize.width;
}
1
Sargis Gevorgyan

Je règle la hauteur, avec 2 lignes dans mon label

lblUserQuestion.preferredMaxLayoutWidth = 100.0f;

100.0f, c'est une taille que je voulais, et une autre ligne,

[lblUserQuestion sizeToFit];

Ma méthode complète est,

UILabel *lblUserQuestion = [[UILabel alloc] initWithFrame:CGRectMake(61, 25, self.frame.size.width-61-20, 37.0f)];
    lblUserQuestion.numberOfLines= 0;
    lblUserQuestion.font =[UIFont fontWithName:@"HelveticaNeue-Thin" size:14.];
lblUserQuestion.adjustsFontSizeToFitWidth = YES;
    lblUserQuestion.minimumScaleFactor = 0.5;
    lblUserQuestion.preferredMaxLayoutWidth= 100.0f;
    lblUserQuestion.text = _photoToVote.label; 
1
Vinicius Carvalho