How to add line break for UILabel?
Asked Answered
F

21

291

Let see that I have a string look like this:

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

How do I make it so that the UILabel display the message like this

AAAAA
BBBBB
CCCCC

I don't think \n is recognized by UILabel, so is there anything that I can put inside NSString so that UILabel knows that it has to create a line break there?

Faulk answered 22/2, 2010 at 17:52 Comment(0)
T
347

Use \n as you are using in your string.

Set numberOfLines to 0 to allow for any number of lines.

label.numberOfLines = 0;

Update the label frame to match the size of the text using sizeWithFont:. If you don't do this your text will be vertically centered or cut off.

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

Update : Replacement for deprecated

sizeWithFont:constrainedToSize:lineBreakMode:

Reference, Replacement for deprecated sizeWithFont: in 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);
Twofold answered 23/2, 2010 at 0:50 Comment(3)
UILabel doesn't have a origin nor size property on iOS? It should probably be label.frame.origin.x etc.Cerium
Instead of using sizeWithAttributes then setting the frame, you can just call sizeToFit to work-out and set the frame size in one quick step.Philipps
@Hermang, thanks for editing the answer to bring it up to date.Twofold
T
296

enter image description here

Use option-return when typing in the little box in Interface Builder to insert a line feed (\n). In Interface Builder's Label attributes, set # Lines = 0.

Select the label and then change Lines property to 0 like in the above image, and then use \n in your string for line break.

Triptych answered 3/1, 2011 at 22:49 Comment(3)
Does not work when setting label programmatically and adding \n (newline) to the string.Munson
amazing. My requirement was to do this with storyboard label only. And this worked like a charm.Aigrette
NOTE: If you are setting in the storyboard label, and you're still having issues, make sure the label height is long enough to account for two lines. Even if it properly displays before building, it might have insufficient height upon loadingAntecede
S
160

In the interface builder, you can use Ctrl + Enter to insert /n to the position you want. This way could implement the following situation

aaa
aaaaaaa

Slyke answered 14/9, 2015 at 10:14 Comment(3)
or use alt+enterBrunn
Great post! Small correction: I believe you mean insert \n instead of insert /nAntecede
That worked for me for getting paragraphs in CATextLayer using NSAttributedString as a @IBInspectableMckamey
J
136

If you read a string from an XML file, the line break \n in this string will not work in UILabel text. The \n is not parsed to a line break.

Here is a little trick to solve this issue:

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

myLabel.text = myLabelText;

So you have to replace the unparsed \n part in your string by a parsed \n in a hardcoded NSString.

Here are my other label settings:

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

Most important is to set numberOfLines to 0 (= unlimited number of lines in label).

No idea why Apple has chosen to not parse \n in strings read from XML?

Jessen answered 4/1, 2011 at 0:29 Comment(2)
iOS doesn't parse \n when getting strings from Parse.com (I guess it will also happen when getting string from other APIs)Davisdavison
You saved my day. I'm getting string with newline from xml files.Larimor
J
25

You have to set the numberOfLines property on the UILabel. The default is 1, if you set it to 0 it will remove all limits.

Jehovist answered 22/2, 2010 at 17:58 Comment(0)
P
24

Important to note it's \n (backslash) rather than /n.

Prakash answered 10/5, 2010 at 11:2 Comment(0)
K
17

For those of you who want an easy solution, do the following in the text Label input box in Interface Builder:

Make sure your number of lines is set to 0.

Alt + Enter

(Alt is your option key)

Cheers!

Kemp answered 31/3, 2020 at 3:38 Comment(0)
L
12

In Swift 2.2, > iOS 8

I've set Lines = 0 on Storyboard, under Attribute Inspector and linked a referencing outlet to the label. Then use in controller like this:

 @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"
 }
Landau answered 10/6, 2016 at 0:8 Comment(0)
C
9

In xCode 11, Swift 5 the \n works fine, try the below code:

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"
Classicist answered 4/1, 2020 at 18:36 Comment(0)
F
8

Just do it like this

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;
Fiscal answered 28/7, 2016 at 9:26 Comment(0)
F
6

// DO not forget to set numberOfLines to zero

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];
Footworn answered 5/3, 2012 at 12:3 Comment(0)
W
4

If your using a UILabel you have to remember that the default setting is 1 line, so it does not matter how many breaks you add (\n or \r), you need to make sure it is set to more than one line so it could be allowed to append more lines.

One alternative is to use UITextView which is really meant for multilines.

You can easily achieve this in XCode attribute section of the UILabel, see screenshot:

enter image description here

Wineskin answered 25/10, 2013 at 16:19 Comment(1)
If you set the number of lines to 0 then you are guaranteed unlimited number of lines, so that if your code changes in the future to say... beyond 3 lines, then you will not run into problems. It's unknown why Apple took this approach.Classicist
Y
4

On Xcode 6, you can just use \n even inside a string when using word wrap. It will work. So for example:

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;
Yippee answered 22/7, 2015 at 9:47 Comment(0)
S
3

In my case also \n was not working, I fixed issue by keeping number of lines to 0 and copied and pasted the text with new line itself for example instead of Hello \n World i pasted

Hello

World

in the interface builder.

Schutzstaffel answered 15/8, 2015 at 8:12 Comment(1)
Excellent! Works.Hertz
S
2

Just using label.numberOfLines = 0;

Suboceanic answered 10/1, 2014 at 9:49 Comment(0)
M
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);
Milwaukee answered 15/8, 2015 at 8:51 Comment(0)
R
0

For anyone else that might have trouble with sizeWithFont:constrainedToSize:lineBreakMode: or anyone switching to ios8 (the method is deprecated as of ios7), I adjusted my height by using sizeToFit instead.

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);
Reverberatory answered 15/7, 2014 at 23:38 Comment(0)
S
0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
Subtangent answered 16/2, 2015 at 13:53 Comment(0)
S
0

It seems wrong to me to change the label frame sizes especially when using autolayout. Using the appendFormat method seems more appropriate. Here is my example:

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;
Squeeze answered 6/7, 2015 at 16:59 Comment(0)
C
0

If you set your UILable properties from Plain to Attributed...the UILabel will hold multiline text no matter how many paragraphs for along as your UILabel height and width are set to fit the screen area you want to display the text in.

Carnassial answered 11/8, 2015 at 11:12 Comment(0)
P
0

I have faced same problem, and here is, how i solved the problem. Hope this will be helpful for someone.

// Swift 2

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

// Objective-C

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

// C# (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
Preparation answered 7/12, 2015 at 10:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.