web-dev-qa-db-fra.com

Comment ajuster la taille d'une étiquette à la longueur du texte

J'ai cherché la solution à ce problème dans le passé, mais je n'ai pas trouvé le bon.
Quelqu'un sait-il comment ajuster une taille UILabel de manière dynamique pour l'adapter à la longueur du texte?
J'ai téléchargé la capture d'écran de ce que je ne veux pas (1ère ligne) et de ce que je veux (2ème ligne).
.__ J'apprécierais tout indice, conseil ou échantillon de code. Je vous remercie.enter image description here

14
boochan224

Ce que vous recherchez est la méthode UILabel sizeToFit

Je peux vous expliquer, mais la meilleure réponse pour savoir comment travailler avec UILabel est la suivante: https://stackoverflow.com/a/1054681/666479

13
ggrana

Xcode 8 et iOS 10

C'est assez facile à faire avec la mise en page automatique. Pas besoin de faire quoi que ce soit dans le code.

 enter image description here

Utiliser la mise en page automatique

Utilisez la mise en page automatique pour épingler les bords supérieur et gauche uniquement de chaque étiquette. N'ajoutez pas de contraintes pour la largeur et la hauteur. La taille du contenu intrinsèque de la vue s'en chargera. 

 enter image description here

Voici à quoi ressemblent les contraintes:

 enter image description here

Code

Le code n'a rien de spécial. Pas besoin d'utiliser sizeToFit ou quoi que ce soit du genre.

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var labelOne: UILabel!
    @IBOutlet weak var labelTwo: UILabel!
    @IBOutlet weak var labelThree: UILabel!

    @IBAction func changeTextButtonTapped(_ sender: UIButton) {

        labelOne.text = "David"
        labelTwo.text = "met"
        labelThree.text = "her"
    }
}

Remarques

  • Cette réponse a été retestée avec Xcode 8, iOS 10 et Swift 3.
  • Voir mon autre réponse si vous souhaitez redimensionner plusieurs lignes.
  • Merci à cette réponse pour me mettre sur la bonne voie.
6
Suragch

Utilisez cette classe UILabel étendue:

//
//  UILabelExtended.h

//
//  Created by Prateek on 6/18/11.



#import <Foundation/Foundation.h>

/*  **********************************************************************************************
        This class inherit the class UILabel and extend the features of UILabel. 
    ********************************************************************************************** */
@interface UILabelExtended : UILabel {
   __unsafe_unretained id  customDelegate;
    id  objectInfo;
    SEL selector;
}

@property (nonatomic,assign) SEL selector;;
@property (nonatomic,assign) id  customDelegate;
@property (nonatomic,retain) id  objectInfo;
@end

@interface UILabel(UILabelCategory)
- (void)setHeightOfLabel;
- (void)setWidthOfLabel;
- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight;
- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth ;
@end

UILabelExtended.m

//
//  Created by Prateek on 6/18/11.

//

#import "UILabelExtended.h"


@implementation UILabelExtended
@synthesize selector,customDelegate, objectInfo;

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(self.selector)
        if([self.customDelegate respondsToSelector:self.selector]) {
            [self.customDelegate performSelector:self.selector withObject:self];
            return;
        }
}

- (void)dealloc {

    self.customDelegate = nil;
    self.selector = NULL;
    self.objectInfo = nil;
}
@end


@implementation UILabel(UILabelCategory)

- (void)setHeightOfLabel {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, 99999) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.height = height;
    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}


- (void)setWidthOfLabel {
    UILabel* label = self;

        //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
        //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.width = width+5;
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}

- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, maxHeight) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;

    if([label.text length] > 0) {
        if (height > maxHeight) {
            frame.size.height = maxHeight;
        }
        else {
            frame.size.height = height;
        }

    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}

- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth  {
    UILabel* label = self;

    //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        if (width > maxWidth) {
            frame.size.width = maxWidth;
        }
        else {
            frame.size.width = width;
        }
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}
@end

Méthodes d'utilisation: 1) définir le texte de UILabel 2) [yourLBLObj setHeightOfLabel]; ou [yourLBLObj setWidthOfLabel]; Il définira automatiquement la hauteur ou la largeur en fonction du texte.

3
Prateek Prem

vous obtenez simplement calculer UILabel width pour la taille de la chaîne, essayez ce code simple pour set UILabel size

   // Single line, no wrapping;
    CGSize expectedLabelSize = [string sizeWithFont:yourFont];
 //  you get width,height in expectedLabelSize;
//expectedLabelSize.width,expectedLabelSize.height
3
NANNAV

essaye ça 

        NSString *text1 = [NSString stringWithFormat:@"%@",commentText];
        CGSize constraint1 = CGSizeMake(280, 2000);
        CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap];

        UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] ;
        lblComment.lineBreakMode = UILineBreakModeWordWrap;
        lblComment.numberOfLines = size1.height/15;
        [lblComment setFont:[UIFont systemFontOfSize:12]];
        lblComment.text = text1;
        lblComment.tag = shareObjC.userId;
            [lblComment setNeedsDisplay]
1
SAMIR RATHOD

Tout ce que vous avez besoin de mettre juste le code de 2 lignes

lbl1.numberOfLines = 0
    lbl1.sizeToFit()

Il gérera la largeur de l'étiquette selon son contenu.

J'espère que ça aide les autres :)

0
Anjali jariwala

Vous pouvez utiliser cette partie de code pour calculer la largeur de l'étiquette et la définir 

   CGSize expectedLabelSize = [name sizeWithFont:yourfont constrainedToSize:maximumLabelSize]; 

// vous pouvez obtenir la largeur, la largeur, la hauteur de la valeur prévue de LabelLabelSize

0
the1pawan

Je travaille actuellement sur IOS-8 et de petites modifications ont été apportées à la réponse de @Suragch (vous devez utiliser la mise en page automatique pour que cela fonctionne).

Voici l'étape et la capture d'écran dans le résultat:

  1. Placez la vue texte dans UIView et non directement dans content-viewin storyboard
  2. Désactiver le défilement de la vue texte du storyboard
  3. Ajouter des contraintes de début et de haut, comme je l’ai ajouté, dans la vue ci-dessous Screenshot (La contrainte de fin est facultative, mais j’ai ajoutée)

Il n'est pas nécessaire d'ajouter du code dans Swift, cela peut être fait dans le storyboard lui-même.

Résultat :  enter image description here

0
KOTIOS