web-dev-qa-db-fra.com

Plusieurs lignes de texte dans UILabel

Existe-t-il un moyen d'avoir plusieurs lignes de texte dans UILabel comme dans le UITextView ou devrais-je utiliser le second à la place?

416
Ilya Suzdalnitski

J'ai trouvé une solution.

Il suffit d'ajouter le code suivant:

// Swift
textLabel.lineBreakMode = .ByWordWrapping // or NSLineBreakMode.ByWordWrapping
textLabel.numberOfLines = 0 

// For Swift >= 3
textLabel.lineBreakMode = .byWordWrapping // notice the 'b' instead of 'B'
textLabel.numberOfLines = 0

// Objective-C
textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

// C# (Xamarin.iOS)
textLabel.LineBreakMode = UILineBreakMode.WordWrap;
textLabel.Lines = 0;  

Ancienne réponse restaurée (pour référence et les développeurs souhaitant prendre en charge iOS au-dessous de 6.0):

textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

Sur le côté: les deux valeurs enum donnent tout de même un 0.

759
Ilya Suzdalnitski

Dans IB, définissez le nombre de lignes sur 0 (autorise les lignes illimitées)

Lorsque vous tapez dans le champ de texte en utilisant IB, utilisez "alt-return" pour insérer un retour et allez à la ligne suivante (ou vous pouvez copier du texte déjà séparé par des lignes).

La meilleure solution que j'ai trouvée (à un problème autrement frustrant qui aurait dû être résolu dans le cadre) est similaire à celle de vaychick.

Il suffit de définir le nombre de lignes à 0 dans IB ou code

myLabel.numberOfLines = 0;

Cela affichera les lignes nécessaires mais repositionnera l'étiquette de sorte qu'elle soit centrée horizontalement (de sorte qu'une étiquette à 1 ligne et à 3 lignes soient alignées dans leur position horizontale). Pour résoudre ce problème, ajoutez:

CGRect currentFrame = myLabel.frame;
CGSize max = CGSizeMake(myLabel.frame.size.width, 500);
CGSize expected = [myString sizeWithFont:myLabel.font constrainedToSize:max lineBreakMode:myLabel.lineBreakMode]; 
currentFrame.size.height = expected.height;
myLabel.frame = currentFrame;
51

Utilisez ceci pour avoir plusieurs lignes de texte dans UILabel:

textLabel.lineBreakMode = NSLineBreakByWordWrapping;
textLabel.numberOfLines = 0;

Rapide:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0
31
Abi
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];
20

Si vous devez utiliser le: 

myLabel.numberOfLines = 0;

vous pouvez également utiliser un saut de ligne standard ("\n"), en code, pour forcer une nouvelle ligne.

15
Tim Maher-De Troyer

Vous pouvez utiliser \r pour aller à la ligne suivante tout en remplissant la UILabel en utilisant NSString.

UILabel * label;


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"];
13
prajul

Essayons ça

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          
12
user40910
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 0;

La solution ci-dessus ne fonctionne pas dans mon cas. Je fais comme ça:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ...

    CGSize size = [str sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0] constrainedToSize:CGSizeMake(240.0, 480.0) lineBreakMode:UILineBreakModeWordWrap];
    return size.height + 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        // ...
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Georgia-Bold" size:18.0];
    }

    // ...

    UILabel *textLabel = [cell textLabel];
    CGSize size = [text sizeWithFont:[UIFont fontWithName:@"Georgia-Bold" size:18.0]
                                        constrainedToSize:CGSizeMake(240.0, 480.0)
                                            lineBreakMode:UILineBreakModeWordWrap];

    cell.textLabel.frame = CGRectMake(0, 0, size.width + 20, size.height + 20);

    //...
}
10
bartolo-otrit

Utilisez story borad: sélectionnez l’étiquette pour définir le nombre de lignes à zéro ...... ou reportez-vous à ceci

 enter image description here

8
Vijay Sharma
UILabel *helpLabel = [[UILabel alloc] init];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:label];
helpLabel.attributedText = attrString;
// helpLabel.text = label;

helpLabel.textAlignment = NSTextAlignmentCenter;
helpLabel.lineBreakMode = NSLineBreakByWordWrapping;
helpLabel.numberOfLines = 0;

Pour certaines raisons, cela ne fonctionne pas pour moi dans iOS 6, je ne sais pas pourquoi. Essayé avec et sans texte attribué. Aucune suggestion.

6
Rajashekar

Swift 3
Définissez le nombre de lignes zéro pour les informations de texte dynamique, il sera utile pour faire varier le texte.

var label = UILabel()
let stringValue = "A label\nwith\nmultiline text."
label.text = stringValue
label.numberOfLines = 0
label.lineBreakMode = .byTruncatingTail // or .byWrappingWord
label.minimumScaleFactor = 0.8 . // It is not required but Nice to have a minimum scale factor to fit text into label frame

enter image description here

6
Krunal
Try using this code:

lblName.numberOfLines = 0;
[lblName sizeToFit];
5
Mubin Shaikh

vous devriez essayer ceci:

-(CGFloat)dynamicLblHeight:(UILabel *)lbl
{
    CGFloat lblWidth = lbl.frame.size.width;
    CGRect lblTextSize = [lbl.text boundingRectWithSize:CGSizeMake(lblWidth, MAXFLOAT)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                            attributes:@{NSFontAttributeName:lbl.font}
                                               context:nil];
    return lblTextSize.size.height;
}
3
Pritesh

Ces choses m'ont aidé 

Changer ces propriétés de UILabel 

label.numberOfLines = 0;
label.adjustsFontSizeToFitWidth = NO;
label.lineBreakMode = NSLineBreakByWordWrapping;

Et tout en donnant une chaîne, utilisez\n pour afficher différents mots sur différentes lignes.

Exemple :

 NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;
3
iPhoneDeveloper
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];
2
Gaurav Gilani

Vous pouvez aussi le faire via le Storyboard: 

  1. Sélectionnez l'étiquette sur le contrôleur de vue
  2. Dans l'inspecteur d'attributs, augmentez la valeur de l'option Ligne (appuyez sur Alt + Cmd + 4 pour afficher l'inspecteur des attributs).
  3. Double-cliquez sur l'étiquette dans le contrôleur de vue et écrivez ou collez votre texte.
  4. Redimensionnez l’étiquette et/ou augmentez la taille de la police afin que tout le texte puisse être affiché
2
OsLivon

Je suis d'accord avec Jarred Olson, NSLineBreakByWordWrapping} est default . J'ai ajouté la propriété sizeToFit comme le guide de Gurumoorthy Arumugam pour le réparer.

Si vous souhaitez que la police à l’intérieur de votre étiquette s’ajuste pour s’adapter aux limites de l’étiquette. Vous pouvez utiliser :

textLabel.adjustsFontSizeToFitWidth = YES;

Merci a tous.

2
ryan tran
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";
1
Gaurav Gilani

Placez ci-dessous soit dans le code, soit dans le storyboard lui-même

Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;

et n'oubliez pas de définir les contraintes gauche, droite, haut et bas pour l'étiquette, sinon cela ne fonctionnera pas.

1
Ankit garg

Méthode 1:

extension UILabel {
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want Word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Maintenant, appelez simplement comme ça 

myLbl.lblFunction()//Replace your label name 

Méthode 2:

Par programme

yourLabel.numberOfLines = 0
yourLabel.lineBreakMode = .byWordWrapping//If you want Word wraping
yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping

Méthode 3:

À travers le story board

Pour afficher plusieurs lignes réglées sur 0 (zéro), cela affichera plus d'une ligne dans votre étiquette.

Si vous souhaitez afficher n lignes, définissez n.

Voir l'écran ci-dessous.

 enter image description here

Si vous souhaitez définir une taille de police minimale pour l’étiquette Cliquez sur l’option Réduction automatique et sélectionnez la taille de police minimale

Voir les écrans ci-dessous

 enter image description here

Ici définir la taille de police minimale

EX: 9 (Dans cette image)

Si votre étiquette reçoit plus de texte à ce moment-là, votre texte sera réduit jusqu'à 9.

 enter image description here

1
iOS

Déjà répondu, mais vous pouvez aussi le faire manuellement dans le storyboard. Sous Inspecteur d'attributs pour le libellé, vous pouvez modifier les sauts de ligne en retour à la ligne (ou retour à la ligne).

1
Fleija

Dans cette fonction, la chaîne de caractères que vous souhaitez affecter à l'étiquette et la taille de la police à la place de self.activityFont et la largeur de l'étiquette à la place de 235, vous obtenez maintenant la hauteur de l'étiquette en fonction de votre chaîne . 

-(float)calculateLabelStringHeight:(NSString *)answer
{
    CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil];
    return textRect.size.height;

}
1
Nripendra singh

Swift 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 
0
Sumona Salma

Sur C #, cela a fonctionné pour moi dans UITableViewCell.

        UILabel myLabel = new UILabel();
        myLabel.Font = UIFont.SystemFontOfSize(16);
        myLabel.Lines = 0;
        myLabel.TextAlignment = UITextAlignment.Left;
        myLabel.LineBreakMode = UILineBreakMode.WordWrap;
        myLabel.MinimumScaleFactor = 1;
        myLabel.AdjustsFontSizeToFitWidth = true;

       myLabel.InvalidateIntrinsicContentSize();
       myLabel.Frame = new CoreGraphics.CGRect(20, mycell.ContentView.Frame.Y + 20, cell.ContentView.Frame.Size.Width - 40, mycell.ContentView.Frame.Size.Height);
       myCell.ContentView.AddSubview(myLabel);

Je pense que le point ici est: -

            myLabel.TextAlignment = UITextAlignment.Left;
            myLabel.LineBreakMode = UILineBreakMode.WordWrap;
            myLabel.MinimumScaleFactor = 1;
            myLabel.AdjustsFontSizeToFitWidth = true;
0
A.G