291 votes

Comment ajouter un saut de ligne pour UILabel ?

Voyons si j'ai une chaîne de caractères qui ressemble à ceci :

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

Comment puis-je faire en sorte que l'étiquette UILabel affiche le message comme ceci

AAAAA
BBBBB
CCCCC

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

347voto

Gerry Points 2710

Utilisez \n que vous utilisez dans votre chaîne.

Définissez numberOfLines à 0 pour permettre un nombre quelconque de lignes.

label.numberOfLines = 0;

Mettez à jour le cadre de l'étiquette pour qu'il corresponde à la taille du texte à l'aide de la fonction 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 de la version obsolète

sizeWithFont:constrainedToSize:lineBreakMode:

Référence, Remplacement de sizeWithFont : déprécié 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);

2 votes

UILabel n'a pas de origin ni size sur iOS ? Elle devrait probablement être label.frame.origin.x etc.

1 votes

Au lieu d'utiliser sizeWithAttributes puis de définir le cadre, vous pouvez simplement appeler sizeToFit pour calculer et définir la taille du cadre en une seule étape rapide.

0 votes

@Hermang, merci d'avoir modifié la réponse pour la mettre à jour.

296voto

Marco Points 3763

enter image description here

Utilisez l'option retour lorsque vous tapez dans la petite case dans le Générateur d'interface pour insérer un saut de ligne ( \n ). Dans les attributs d'étiquette d'Interface Builder, définissez # Lines = 0.

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

2 votes

C'est super utile !

0 votes

Je l'ai cherché pendant des années. Merci :)

0 votes

Réponse fantastique. Merci.

136voto

ladhani Points 987

Si vous lisez une chaîne de caractères à partir d'un fichier XML, le saut de ligne \n dans cette chaîne ne fonctionnera pas dans UILabel texte. Le site \n n'est pas analysé comme 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 le code non analysé \n dans votre chaîne de caractères par un \n dans 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 numberOfLines à 0 (= nombre illimité de lignes dans l'étiquette).

Aucune idée de la raison pour laquelle Apple a choisi de ne pas parser \n dans les chaînes de caractères lues à partir de XML ?

J'espère que cela vous aidera.

2 votes

IOS n'analyse pas \n lors de l'obtention de chaînes à partir de Parse.com (je suppose que cela se produira également lors de l'obtention de chaînes à partir d'autres API)

0 votes

Vous avez sauvé ma journée. J'obtiens une chaîne avec une nouvelle ligne à partir de fichiers xml.

25voto

Dan Points 8469

Vous devez définir le numberOfLines sur la propriété UILabel . La valeur par défaut est 1 si vous le réglez sur 0 il supprimera toutes les limites.

24voto

AndyOng Points 71

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X