Comment ajouter un saut de ligne pour UILabel?

262

Voyons que j'ai une chaîne qui ressemble à ceci:

NSString *longStr = @"AAAAA\nBBBBB\nCCCCC";  

Comment puis-je faire en sorte que l'UILabel affiche le message comme celui-ci

AAAAA
BBBBB
CCCCC

Je ne pense pas que \nUILabel soit reconnu, alors y a-t-il quelque chose que je puisse mettre à l'intérieur de NSString pour que UILabel sache qu'il doit y créer un saut de ligne?

Thang Pham
la source

Réponses:

332

Utilisez \ncomme vous utilisez dans votre chaîne.

Définissez numberOfLines sur 0 pour autoriser un nombre illimité de lignes.

label.numberOfLines = 0;

Mettez à jour le cadre d'étiquette pour qu'il corresponde à la taille du texte à l'aide de sizeWithFont:. Si vous ne le faites pas, votre texte sera centré verticalement ou coupé.

UILabel *label; // set frame to largest size you want
...
CGSize labelSize = [label.text sizeWithFont:label.font
                          constrainedToSize:label.frame.size
                              lineBreakMode:label.lineBreakMode];
label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

Mise à jour: remplacement pour obsolète

sizeWithFont:constrainedToSize:lineBreakMode:

Référence, remplacement pour la taille obsolèteWithFont: dans iOS 7?

CGSize labelSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];

label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);
Gerry Shaw
la source
2
UILabeln'a pas de propriété originni sizesur iOS? Cela devrait probablement être label.frame.origin.xetc.
Peterdk
1
Au lieu d'utiliser sizeWithAttributes puis de définir le cadre, vous pouvez simplement appeler sizeToFit pour vous entraîner et définir la taille du cadre en une seule étape rapide.
jimmyjudas
@Hermang, merci d'avoir édité la réponse pour la mettre à jour.
Gerry Shaw
275

entrez la description de l'image ici

Utilisez l'option-return lors de la saisie dans la petite case d'Interface Builder pour insérer un saut de ligne (\ n). Dans les attributs d'étiquette d'Interface Builder, définissez # Lines = 0.

Sélectionnez l'étiquette, puis changez la propriété Lines en 0 comme dans l'image ci-dessus, puis utilisez \ n dans votre chaîne pour le saut de ligne.

Marco
la source
2
c'est super utile!
Nitin Alabur
J'ai cherché ça pour toujours. Merci :)
Shai Mishali
Réponse fantastique. Merci!
TotoroTotoro
1
Ne fonctionne pas lors de la définition d’étiquette par programme et de l’ajout \ n (nouvelle ligne) à la chaîne.
Chewie The Chorkie
incroyable. Mon exigence était de le faire avec une étiquette de story-board uniquement. Et cela a fonctionné comme un charme.
Tejas
132

Si vous lisez une chaîne à partir d'un fichier XML, le saut de ligne \ndans cette chaîne ne fonctionnera pas dans le UILabeltexte. Le \nn'est pas analysé pour un saut de ligne.

Voici une petite astuce pour résoudre ce problème:

// correct next line \n in string from XML file
NSString *myNewLineStr = @"\n";
myLabelText = [myLabelText stringByReplacingOccurrencesOfString:@"\\n" withString:myNewLineStr];

myLabel.text = myLabelText;

Vous devez donc remplacer la \npartie non analysée de votre chaîne par une partie analysée \ndans un code dur NSString.

Voici mes autres paramètres d'étiquette:

myLabel.numberOfLines = 0;
myLabel.backgroundColor = [UIColor lightGrayColor];
myLabel.textColor = [UIColor redColor]; 
myLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];   
myLabel.textAlignment = UITextAlignmentCenter;

Le plus important est de définir numberOfLinessur 0(= nombre illimité de lignes dans l'étiquette).

Vous ne savez pas pourquoi Apple a choisi de ne pas analyser les \nchaînes lues à partir de XML?

J'espère que cela t'aides.

Al-Noor Ladhani
la source
1
iOS \nn'analyse pas lors de l'obtention de chaînes de Parse.com (je suppose que cela se produira également lors de l'obtention de chaînes à partir d'autres API)
Brian
Tu m'as sauvé la journée. Je reçois une chaîne avec une nouvelle ligne à partir de fichiers xml.
Senry
127

Dans le générateur d'interface, vous pouvez utiliser Ctrl+ Enterpour insérer /nà la position souhaitée. Cette façon pourrait implémenter la situation suivante

aaa
aaaaaaa

kuokuo321
la source
Non, je n'ai pas voté contre. Je viens de modifier la réponse pour une meilleure présentation.
m4n0
C'est vraiment simple! +1
marlonpya
2
Je ne peux pas croire que je n'ai jamais connu cette astuce! J'avais essayé shift-enter car c'est assez standard ailleurs. Merci pour ça!
Echelon
c'était exactement ce que je cherchais! merci +1!
rickrvo
1
Très bonne publication! Petite correction: je pense que vous voulez dire insert \ n au lieu de insert / n
craft
25

Vous devez définir la numberOfLinespropriété sur le UILabel. La valeur par défaut est 1 , si vous la définissez sur 0, elle supprimera toutes les limites.

Dan
la source
22

Il est important de noter que c'est \n(barre oblique inverse) plutôt que /n.

AndyOng
la source
10

Dans Swift 2.2,> iOS 8

J'ai défini Lines = 0 sur Storyboard, sous Inspector Inspector et lié une sortie de référence à l'étiquette. Ensuite, utilisez dans le contrôleur comme ceci:

 @IBOutlet weak var listLabel: UILabel!

 override func viewDidLoad() {
      ...
      listLabel.text = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8"
 }
CodeOverRide
la source
7

Faites comme ça

NSString * strCheck = @"A\nB";

strCheck = [strCheck stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];  //This is to prevent for fetching string from plist or data structure

label.numberOfLines = 0;

label.lineBreakMode = NSLineBreakByWordWrapping;

label.text = strCheck;
Sandip Patel - SM
la source
Ça marche .. :)
Bibin Joseph
6

// N'oubliez pas de mettre numberOfLines à zéro

UILabel* locationTitle = [[UILabel alloc] initWithFrame:CGRectMake(5, 30, 230, 40)];
locationTitle.font = [UIFont systemFontOfSize:13.0];
locationTitle.numberOfLines = 0;
locationTitle.text = [NSString stringWithFormat:@"Eaton industries pvt. Ltd \nUK Apr 12"];
[cell addSubview:locationTitle];
Pankaj Chauhan
la source
4

Sur Xcode 6, vous pouvez simplement utiliser \ n même à l'intérieur d'une chaîne lors de l'utilisation de l'habillage de mots. Ça va marcher. Ainsi, par exemple:

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, screenRect.size.width, 50)];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"This will be on the first line\nfollowed by a line under it.";
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
Roi
la source
3

Si vous utilisez un, UILabelvous devez vous rappeler que le paramètre par défaut est 1 ligne, donc peu importe le nombre de sauts que vous ajoutez ( \nou \r), vous devez vous assurer qu'il est défini sur plusieurs lignes afin qu'il puisse être ajouté. plus de lignes.

Une alternative est d'utiliser UITextViewce qui est vraiment destiné aux multilignes.

Vous pouvez facilement y parvenir dans la section d'attributs XCode de l'UILabel, voir capture d'écran:

entrez la description de l'image ici

meda
la source
3

Pour ceux d'entre vous qui souhaitent une solution simple, procédez comme suit dans la zone de saisie Étiquette de texte:

Assurez-vous que vos lignes numériques sont définies sur 0.

Alt + Entrée

(Alt est votre clé d'option)

À votre santé!

Naufragé
la source
2

Juste en utilisant label.numberOfLines = 0;

Frire
la source
2

Dans mon cas également \ n ne fonctionnait pas, j'ai résolu le problème en gardant le nombre de lignes à 0 et copié et collé le texte avec la nouvelle ligne elle-même par exemple au lieu de Hello \ n World i collé

Bonjour

Monde

dans le générateur d'interface.

Ranjithkumar
la source
Excellent! Travaux.
DmitryKanunnikoff
2

Dans xCode 11, Swift 5 \nfonctionne bien, essayez le code ci-dessous:

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"
David_2877
la source
1
textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);
user3182143
la source
0

Pour toute autre personne qui pourrait avoir des problèmes sizeWithFont:constrainedToSize:lineBreakMode:ou passer à ios8 (la méthode est obsolète à partir d'ios7), j'ai ajusté ma taille en utilisant à la sizeToFitplace.

UILabel *label;
label.numberOfLines = 0;
// Setup label with desired settings
...
[label sizeToFit];
label.frame = CGRectMake(label.frame.origin.x,     // Or use any desired origin
                         label.frame.origin.y, 
                         label.frame.size.width,   // Or use any desired width
                         label.frame.size.height);
user3842937
la source
0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
Grigori A.
la source
0

Il me semble erroné de modifier les tailles de cadre d'étiquette, en particulier lors de l'utilisation de la mise en page automatique. L'utilisation de la méthode appendFormat semble plus appropriée. Voici mon exemple:

NSMutableString *list = [[NSMutableString alloc] init];
NSArray *textArray = @[@"AAAA", @"BBBB"];
for (NSString *string in textArray) {
    [list appendFormat:@"%@\n", string.mutableCopy];
}
self.label.text = list;
self.label.numberOfLines = 0;
tanya
la source
0

Si vous définissez vos propriétés UILable de Plain à Attributed ... l'UILabel contiendra du texte multiligne quel que soit le nombre de paragraphes ainsi que la hauteur et la largeur de votre UILabel sont définies pour s'adapter à la zone d'écran dans laquelle vous souhaitez afficher le texte.

BrainyMonkey
la source
0

J'ai rencontré le même problème, et voici comment j'ai résolu le problème. J'espère que cela sera utile pour quelqu'un.

// Swift 2

   lblMultiline.lineBreakMode = .ByWordWrapping // or use NSLineBreakMode.ByWordWrapping
   lblMultiline.numberOfLines = 0 

// Objectif c

  lblMultiline.lineBreakMode = NSLineBreakByWordWrapping;
  lblMultiline.numberOfLines = 0;

// C # (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
Suraj Sonawane
la source