2009-06-13 8 views
393

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

+0

Cocher cette question http://stackoverflow.com/questions/2312899/how-to-add-line-break-for-uilabel – user1766342

+2

Notez que 'UILineBreakModeWordWrap' était obsolète dans iOS 6. Vous devriez maintenant utiliser 'NSLineBreakByWordWrapping = 0' Voir la documentation [ici] (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/Reference /Reference.html#//apple_ref/c/tdef/NSLineBreakMode) – Austin

Répondre

720

J'ai trouvé une solution.

Un juste doit ajouter le code suivant:

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

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

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

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

ancienne restaurée réponse (pour référence et devs prêts à soutenir iOS ci-dessous 6.0):

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

Du côté: les deux valeurs enum céder à 0 de toute façon.

+15

UILineBreakModeWordWrap est en fait le paramètre par défaut, donc vous n'avez pas besoin du sapin st ligne. –

+3

Ne fonctionne pas avec iOS 6.1. – dbarros

+1

Pour ceux qui utilisent swift: 'cell.textLabel? .lineBreakMode = NSLineBreakMode.ByWordWrapping' et' cell.textLabel? .numberOfLines = 0' – boidkan

121

Dans IB, nombre défini de lignes à 0 (permet des lignes illimitées)

Lors de la saisie dans le champ de texte à l'aide IB, utilisez « alt-retour » pour insérer un retour et aller à la ligne suivante (ou vous peut copier dans le texte déjà séparé par des lignes).

+1

[Comme il creuse sciemment un fil de plus d'un an ...] Une chose que je souhaite parfois que je puisse faire dans IB est de saisir du texte * sans * sauts de ligne incorporés, de définir UILineBreakModeWordWrap et numberOfLines = 0, et Ensuite, l'étiquette auto-taille automatiquement la hauteur, tout en continuant à concevoir 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 IB! Peut-être que le fait d'avoir les étiquettes automatiquement dans IB cause plus de problèmes que de solutions? (De plus, vous ne pouvez pas invoquer sizeToFit à ce stade de toute façon.) –

+0

Le truc "0" que j'ai reçu des docs pour UILabel, le retour alt d'un ami qui utilise Interface Builder depuis de nombreuses années. –

+3

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

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

La solution ci-dessus ne fonctionne pas dans mon cas. Je suis en train de faire comme ceci:

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

    //... 
} 
49

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

Juste nombre défini de lignes à 0 dans les deux IB ou le code

myLabel.numberOfLines = 0; 

Cela permet d'afficher les lignes nécessaires mais repositionner l'étiquette de sorte que son centré horizontalement (de sorte qu'une ligne 1 et 3 étiquette de ligne sont alignés dans leur position horizontale). Pour résoudre ce problème, ajouter:

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; 
+0

Résoudre ma requête avec l'aide de vous et @Ilya Suzdalnitski. Merci beaucoup. –

15

Si vous devez utiliser le:

myLabel.numberOfLines = 0; 

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

13

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

UILabel * label; 


label.text = [NSString stringWithFormat:@"%@ \r %@",@"first line",@"seconcd line"]; 
19
myUILabel.numberOfLines = 0; 
myUILabel.text = @"your long string here"; 
[myUILabel sizeToFit]; 
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 de son ne fonctionne pas pour moi dans iOS 6 ne sais pas pourquoi. Je l'ai essayé avec et sans texte attribué. Aucune suggestion.

30

Utilisez cette option pour avoir plusieurs lignes de texte dans UILabel:

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

Swift:

textLabel.lineBreakMode = .byWordWrapping 
textLabel.numberOfLines = 0 
11

permet d'essayer ce

textLabel.lineBreakMode = UILineBreakModeWordWrap;   

textLabel.numberOfLines = 0;       
+0

peut également être défini dans l'attribut IB 'Lines' sur 0 sur UILabel. –

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

N'oubliez pas d'ajouter: [labelName setLineBreakMode: NSLineBreakByWordWrapping]; –

5
Try using this code: 

lblName.numberOfLines = 0; 
[lblName sizeToFit]; 
2

Vous pouvez le faire via le Storyboard aussi:

  1. Sélectionnez l'étiquette sur le contrôleur de vue
  2. Dans l'attribut inspecteur, augmenter la valeur de l'option de ligne (Appuyez sur Alt + Cmd + 4 Afficher les attributs inspecteur)
  3. Double cliquez sur l'étiquette dans le contrôleur de vue et écrire ou coller votre texte
  4. Redimensionner l'étiquette et/ou augmenter la taille de la police afin que le texte entier pourrait être montré
+0

et définissez Lignes à 0, sinon il affichera seulement le texte qui peut être mis dans le nombre de lignes spécifié, d'autres seront omis. –

1

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

1

Dans cette fonction, la chaîne de caractères que vous voulez attribuer à l'étiquette et passer la taille de police à la place de self.activityFont et passer la largeur de l'étiquette à 235, vous obtenez 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

Ce code retourne la hauteur de la taille selon le 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; 
} 
2

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 voulez que la police à l'intérieur de votre étiquette s'ajuste pour correspondre aux limites de l'étiquette. Vous pouvez utiliser:

textLabel.adjustsFontSizeToFitWidth = YES; 

Merci à tous.

3

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

Utilisez histoire borad: sélectionnez l'étiquette pour définir le nombre de lignes à zéro ...... Or Refer this

enter image description here

0

ci-dessous soit dans Set code ou dans le storyboard lui-même

Label.lineBreakMode = NSLineBreakByWordWrapping; Étiquette.numberOfLines = 0; N'oubliez pas de définir les contraintes de gauche, de droite, de haut et de bas pour l'étiquette, sinon cela ne fonctionnera pas.

1

Swift 3
numéro Ensemble 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

3

Ces choses me ont aidé

modifier ces propriétés de UILabel

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

Et tout en entrée l'utilisation de chaînes \ n pour afficher des mots différents dans les différentes lignes.

Exemple:

NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ;