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?

Ilya Suzdalnitski
la source
5
Notez que cette UILineBreakModeWordWrapoption est déconseillée dans iOS 6. Vous devez maintenant utiliser NSLineBreakByWordWrapping = 0Voir la documentation ici
Austin
vérifier cette question stackoverflow.com/questions/2312899/…
user1766342

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.

Ilya Suzdalnitski
la source
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).

Kendall Helmstetter Gelner
la source
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;
Michael Michailidis
la source
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
Abi
la source
21
myUILabel.numberOfLines = 0;
myUILabel.text = @"your long string here";
[myUILabel sizeToFit];
Gurumoorthy Arumugam
la source
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.

Tim Maher-De Troyer
la source
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"];
prajul
la source
14

Essayons ça

textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated     
textLabel.numberOfLines = 0;                          
user40910
la source
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);

    //...
}
Bartolo-Otrit
la source
8

Utilisez Story Borad: sélectionnez l'étiquette pour définir le nombre de lignes à zéro ...... Ou reportez-vous à ceci

entrez la description de l'image ici

Vijay Sharma
la source
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

Krunal
la source
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.

Rajashekar
la source
6

Essayez d'utiliser ceci:

lblName.numberOfLines = 0;
[lblName sizeToFit];
Mubin Shaikh
la source
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" ;
iPhoneDeveloper
la source
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

iOS
la source
2
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
[labelName sizeToFit];
labelName.numberOfLines = 0;
labelName.text = @"Your String...";
[self.view addSubview:labelName];
Gaurav Gilani
la source
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é
OsLivon
la source
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;
}
Pritesh
la source
1
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 150, 30)];
[textLabel sizeToFit];
textLabel.numberOfLines = 0;
textLabel.text = @"Your String...";
Gaurav Gilani
la source
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).

Fleija
la source
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;

}
Nripendra singh
la source
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.

Garçon Ankit
la source
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 
Sumona Salma
la source
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;
AG
la source
-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;
}
Gaurav
la source