UILabel auto resize on basis of text to be shown

92,428

Solution 1

The sizeToFit method worked just great.

I did following.

UILabel *testLabel =[[UILabel alloc] initWithFrame:CGRectMake(6,3, 262,20 )]; // RectMake(xPos,yPos,Max Width I want, is just a container value);

NSString * test=@"this is test this is test inthis is test ininthis is test inthis is test inthis is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...this is test in uilabel ...";

testLabel.text = test;
testLabel.numberOfLines = 0; //will wrap text in new line
[testLabel sizeToFit];

[self.view addSubview:testLabel];

Solution 2

You can find a text size with :

CGSize textSize = [[myObject getALongText] 
                    sizeWithFont:[UIFont boldSystemFontOfSize:15] 
                    constrainedToSize:CGSizeMake(maxWidth, 2000)
                    lineBreakMode:UILineBreakModeWordWrap];

then you can create your UILabel like that :

UILabel * lbl = [[UILabel alloc] initWithFrame:CGRectMake(0,0,textSize.width, textSize.height];
[lbl setNumberOfLines:0];
[lbl setLineBreakMode:UILineBreakModeWordWrap];
[lbl setText:[myObject getALongText]];

Solution 3

In Swift:

testLabel = UILabel(frame: CGRectMake(6, 3, 262, 20))
testLabel.text = test
testLabel.numberOfLines = 0
testLabel.sizeToFit()

In Objective C

UILabel *testLabel = [[UILabel alloc] initWithFrame: CGRectMake(6, 3, 262, 20)]];
testLabel.text = test;
testLabel.numberOfLines = 0;
[testLabel sizeToFit];

Solution 4

If you want to resize the UILabel only in height, use this:

@property (nonatomic, weak) IBOutlet UILabel *titleLabel;

CGRect titleLabelBounds = self.titleLabel.bounds;
titleLabelBounds.size.height = CGFLOAT_MAX;
// Change limitedToNumberOfLines to your preferred limit (0 for no limit)
CGRect minimumTextRect = [self.titleLabel textRectForBounds:titleLabelBounds limitedToNumberOfLines:2];

CGFloat titleLabelHeightDelta = minimumTextRect.size.height - self.titleLabel.frame.size.height;
CGRect titleFrame = self.titleLabel.frame;
titleFrame.size.height += titleLabelHeightDelta;
self.titleLabel.frame = titleFrame;

Now you can use titleLabelHeightDelta to layout other views depending on your label size (without using autolayout).

Solution 5

I'm not sure I totally understand the question, but you can use the sizeToFit method on a UILabel (the method is inherited from UIView) to change the size according to the label text.

Share:
92,428
Admin
Author by

Admin

Updated on July 09, 2022

Comments

  • Admin
    Admin almost 2 years

    I'm working on an application, in which I'm required to autoresize the text area on basis of text to be displayed.

    Firstly, I'm not sure for this either I should use UILabel (Logically is the best choice for displaying static text, which is in my case) or UITextView.

    How I wish to use it?
    I want to simply init my Label or text view for that matter with Text. Instead I define the frame first and then restrict my text in that area.

    If you can suggest the right solution, that will be a great help.

    I went through documentation and other references but didn't find much which could help me here or I could've overlooked it.

  • Erik Tjernlund
    Erik Tjernlund about 13 years
    @user676298 please mark at least one of the answers as an answer if it helped you.
  • cV2
    cV2 over 12 years
    resized the view horizontally not vertically
  • Berik
    Berik about 11 years
    Wrong: you should not ask the NSString what size it will be when you will draw it inside a UILabel.
  • Fonix
    Fonix almost 11 years
    beriks solution resizes vertically properly
  • Ilja Popov
    Ilja Popov over 8 years
    This message do provide an answer to the question for modern autolayout technique, just read it carefully.