Is there a way to have multiple lines of text in UILabel like in the UITextView or should I use the second one instead?
26 Answers
Set the line break mode to word-wrapping and the number of lines to 0:
// Swift textLabel.lineBreakMode = .byWordWrapping textLabel.numberOfLines = 0 // Objective-C textLabel.lineBreakMode = NSLineBreakByWordWrapping; textLabel.numberOfLines = 0; // C# (Xamarin.iOS) textLabel.LineBreakMode = UILineBreakMode.WordWrap; textLabel.Lines = 0; Restored old answer (for reference and devs willing to support iOS below 6.0):
textLabel.lineBreakMode = UILineBreakModeWordWrap; textLabel.numberOfLines = 0; On the side: both enum values yield to 0 anyway.
6 Comments
cell.textLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping and cell.textLabel?.numberOfLines = 0In IB, set number of lines to 0 (allows unlimited lines)
When typing within the text field using IB, use "alt-return" to insert a return and go to the next line (or you can copy in text already separated out by lines).
4 Comments
The best solution I have found (to an otherwise frustrating problem that should have been solved in the framework) is similar to vaychick's.
Just set number of lines to 0 in either IB or code
myLabel.numberOfLines = 0; This will display the lines needed but will reposition the label so its centered horizontally (so that a 1 line and 3 line label are aligned in their horizontal position). To fix that add:
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; 1 Comment
lets try this
textLabel.lineBreakMode = NSLineBreakModeWordWrap; // UILineBreakModeWordWrap deprecated textLabel.numberOfLines = 0; 1 Comment
textLabel.lineBreakMode = UILineBreakModeWordWrap; textLabel.numberOfLines = 0; The solution above does't work in my case. I'm doing like this:
- (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); //... } Comments
Swift 3
Set number of lines zero for dynamic text information, it will be useful for varying text.
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 
Comments
Try using this:
lblName.numberOfLines = 0; [lblName sizeToFit]; 1 Comment
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; For some reasons its not working for me in iOS 6 not sure why. Tried it with and without attributed text. Any suggestions.
Comments
Method 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 } } Now call simply like this
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 } } Method 2:
Programmatically
yourLabel.numberOfLines = 0 yourLabel.lineBreakMode = .byWordWrapping//If you want word wraping //OR yourLabel.lineBreakMode = .byCharWrapping//If you want character wraping Method 3:
Through Story board
To display multiple lines set 0(Zero), this will display more than one line in your label.
If you want to display n lines, set n.
See below screen.
If you want to set minimum font size for label Click Autoshrink and Select Minimum Font Size option
See below screens
Here set minimum font size
EX: 9 (In this image)
If your label get more text at that time your label text will be shrink upto 9
Comments
These things helped me
Change these properties of UILabel
label.numberOfLines = 0; label.adjustsFontSizeToFitWidth = NO; label.lineBreakMode = NSLineBreakByWordWrapping; And while giving input String use \n to display different words in different lines.
Example :
NSString *message = @"This \n is \n a demo \n message for \n stackoverflow" ; Comments
Oh, in 2021 I'm trapped by a label text unable to change lines for 1 hour, then realize I forget to set label's width, WTF.
let stepLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.textAlignment = .center label.lineBreakMode = .byWordWrapping label.numberOfLines = 0 label.text = "Put your device and computer under same Wi-Fi network." return label }() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white view.addSubview(stepLabel) NSLayoutConstraint.activate([ stepLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), stepLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor), stepLabel.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.7) ]) } 1 Comment
UILabel *labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)]; [labelName sizeToFit]; labelName.numberOfLines = 0; labelName.text = @"Your String..."; [self.view addSubview:labelName]; 1 Comment
You can do that via the Storyboard too:
- Select the Label on the view controller
- In the Attribute Inspector, increase the value of the Line option (Press Alt+Cmd+4 to show Attributes Inspector)
- Double click the Label in the view controller and write or paste your text
- Resize the Label and/or increase the font size so that the whole text could be shown
1 Comment
you should try this:
-(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; } Comments
In this function pass string that you want to assign in label and pass font size in place of self.activityFont and pass label width in place of 235, now you get label height according to your string. it will work fine.
-(float)calculateLabelStringHeight:(NSString *)answer { CGRect textRect = [answer boundingRectWithSize: CGSizeMake(235, 10000000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.activityFont} context:nil]; return textRect.size.height; } Comments
Set below either in code or in storyboard itself
Label.lineBreakMode = NSLineBreakByWordWrapping; Label.numberOfLines = 0;
and please don't forget to set left, right, top and bottom constraints for label otherwise it won't work.
1 Comment
On C#, this worked for me inside 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); I think the point here is:-
myLabel.TextAlignment = UITextAlignment.Left; myLabel.LineBreakMode = UILineBreakMode.WordWrap; myLabel.MinimumScaleFactor = 1; myLabel.AdjustsFontSizeToFitWidth = true; Comments
This code is returning size height according to text
+ (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; } 



UILineBreakModeWordWrapwas deprecated in iOS 6. You should now useNSLineBreakByWordWrapping = 0See the documentation here