Plusieurs lignes de texte dans UILabel


443

Existe-t-il un moyen d'avoir plusieurs lignes de texte UILabelcomme dans le UITextViewou dois-je utiliser la deuxième à la place?


5
Notez que cette UILineBreakModeWordWrapoption est déconseillée dans iOS 6. Vous devez maintenant utiliser NSLineBreakByWordWrapping = 0Voir la documentation ici
Austin

Réponses:


796

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 en dessous de 6.0):

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

Sur le côté: les deux valeurs enum cèdent 0quand même.


16
UILineBreakModeWordWrap est en fait la valeur par défaut, vous n'avez donc pas besoin de la première ligne.
Jarred Olson

1
Pour ceux qui utilisent swift: cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrappingetcell.textLabel?.numberOfLines = 0
boidkan

5
Merci d'avoir également fourni Xamarin-Code. La saisie semi-automatique n'a pas fonctionné car ils ont choisi d'abréger cette propriété ... +1
Jan Gillich

Je suis d'accord avec Jarred Olson, NSLineBreakByWordWrapping est par défaut . 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.
ryan tran

@JarredOlson Docs dit "Cette propriété est définie par byTruncatingTail par défaut."
Projet de loi

138

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

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


1
[Comme il déterre sciemment un fil de plus d'un an…] Une chose que je souhaite parfois pouvoir faire dans IB est de saisir du texte sans sauts de ligne intégrés, définissez UILineBreakModeWordWrap et numberOfLines = 0, puis définissez le libellé auto -taillez la hauteur automagiquement, tout en concevant toujours dans IB. Je pense au cas où la vue est redimensionnée en paysage, où les sauts de ligne dans l'étiquette peuvent être problématiques. Ou ... je pourrais abuser d'IB! Peut-être que le dimensionnement automatique des étiquettes dans IB cause plus de problèmes qu'il n'en résout? (De plus, vous ne pouvez pas invoquer sizeToFit à ce stade de toute façon.)
Joe D'Andrea

La chose "0" que j'ai obtenue des documents pour UILabel, l'alt-return d'un ami qui utilise Interface Builder depuis de nombreuses années.
Kendall Helmstetter Gelner

3
+1 pour être la seule réponse à mentionner "alt-return". En particulier, "ctrl-return" semble fonctionner mais ne fonctionne pas.
paulmelnikow

52

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.

Définissez simplement le nombre de lignes à 0 dans IB ou dans le code

myLabel.numberOfLines = 0;

Cela affichera les lignes nécessaires mais repositionnera l'étiquette de manière à ce qu'elle soit centrée horizontalement (de sorte qu'une étiquette de 1 ligne et de 3 lignes soient alignées dans leur position horizontale). Pour corriger cela, 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;

Résolvez ma requête avec l'aide de vous et @Ilya Suzdalnitski. Merci beaucoup.
Mihir Oza

33

Utilisez ceci pour avoir plusieurs lignes de texte dans UILabel:

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

Rapide:

textLabel.lineBreakMode = .byWordWrapping
textLabel.numberOfLines = 0


16

Si vous devez utiliser:

myLabel.numberOfLines = 0;

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


15

Vous pouvez utiliser \rpour passer à la ligne suivante tout en remplissant l' UILabelutilisation NSString.

UILabel * label;


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

14

Essayons ça

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

cela peut également être défini dans l'attribut IB "Lines" à 0 sur UILabel.
KoreanXcodeWorker

11
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);

    //...
}


8

Swift 3
Définissez le nombre de lignes zéro pour les informations de texte dynamique, il sera utile pour 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

entrez la description de l'image ici


1
Merci Krunal ça marche pour moi!
Yogesh Patel

6
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. Je l'ai essayé avec et sans texte attribué. Aucune suggestion.


6

Essayez d'utiliser ceci:

lblName.numberOfLines = 0;
[lblName sizeToFit];

sizeToFit ne fonctionne pas lorsque numberOfLine est différent de 0. C'est intéressant.
Onur Tuna

3

Ces choses m'ont aidé

Modifier ces propriétés de UILabel

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

Et lors de la saisie de la 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

Méthode 1:

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Maintenant, appelez simplement comme ça

myLbl.lblFunction()//Replace your label name 

EX:

Import UIKit

class MyClassName: UIViewController {//For example this is your class. 

    override func viewDidLoad() {
    super.viewDidLoad()

        myLbl.lblFunction()//Replace your label name 

    }

}//After close of your class write this extension.

extension UILabel {//Write this extension after close brackets of your class
    func lblFunction() {
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        //OR
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Méthode 2:

Par programme

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

Méthode 3:

Par le biais de Story board

Pour afficher plusieurs lignes définies sur 0 (zéro), cela affichera plusieurs lignes dans votre étiquette.

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

Voir l'écran ci-dessous.

entrez la description de l'image ici

Si vous souhaitez définir la taille de police minimale pour l'étiquette Cliquez sur l'option Rétrécissement automatique et sélectionnez la taille de police minimale

Voir les écrans ci-dessous

entrez la description de l'image ici

Définissez ici la taille de police minimale

EX: 9 (dans cette image)

Si votre étiquette obtient plus de texte à ce moment-là, le texte de votre étiquette sera réduit jusqu'à 9

entrez la description de l'image ici


2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];

n'oubliez pas d'ajouter: [labelName setLineBreakMode: NSLineBreakByWordWrapping];
Irineu Licks Filho

2

Vous pouvez également 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 de ligne (appuyez sur Alt + Cmd + 4 pour afficher l'inspecteur d'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 pour que tout le texte puisse être affiché

et définissez Lines sur 0, sinon il n'affichera que le texte qui peut être mis dans le nombre de lignes spécifié, les autres seront omis.
toing_toing

2

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

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

1

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


1

Dans cette fonction, passez la chaîne que vous souhaitez attribuer à l'étiquette et passez la taille de la police à la place de self.activityFont et passez la largeur de l'étiquette à la place de 235, vous obtenez maintenant la hauteur de l'étiquette en fonction de votre chaîne. cela fonctionnera bien.

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

}

1

Définissez ci-dessous dans le code ou 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.


Partout, il est indiqué de mettre le mot retour à la ligne et le nombre de lignes à 0. Mais le mien n'a toujours pas été renvoyé à la ligne. Le réglage des contraintes gauche, haut, bas et droite l'a fait boucler.
anoo_radha

1

Swift 4:

label.lineBreakMode = .byWordWrapping

label.numberOfLines = 0

label.translatesAutoresizingMaskIntoConstraints = false

label.preferredMaxLayoutWidth = superview.bounds.size.width - 10 

0

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;

-2

Ce code renvoie la taille en fonction du texte

+ (CGFloat)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font
 {
    CGFloat result = font.pointSize+4;
    if (text) 
{
        CGSize size;

        CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, 999)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:@{NSFontAttributeName:font}
                                          context:nil];
        size = CGSizeMake(frame.size.width, frame.size.height+1);
        result = MAX(size.height, result); //At least one row
    }
    return result;
}
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.