How to adjust a label size to fit the length of the text
Asked Answered
T

8

14

I have searched the solution to this in the past QAs, but could not find the right one.
Does anyone know how to adjust aUILabel size dynamically to fit the text length?
I have uploaded the screen shot of what I don't want(1st line) and what I want(2nd line).
I'd appreciate any clues, advice or code sample. Thank you.enter image description here

Thuggee answered 1/6, 2013 at 1:50 Comment(0)
A
13

What you are searching is the UILabel method sizeToFit

I can try to explain to you, but the best answer to know how to work with UILabel is that: https://mcmap.net/q/40534/-vertically-align-text-to-top-within-a-uilabel

Armin answered 1/6, 2013 at 1:57 Comment(0)
H
6

Xcode 8 and iOS 10

This is quite easy to do with Auto Layout. No need to do anything in code.

enter image description here

Use Auto Layout

Use auto layout to pin each label's top and left edges only. Don't add constraints for the width and height. The view's intrinsic content size will take care of that.

enter image description here

Here is what the constraints look like:

enter image description here

Code

There is nothing at all special about the code. No need to use sizeToFit or anything like that.

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var labelOne: UILabel!
    @IBOutlet weak var labelTwo: UILabel!
    @IBOutlet weak var labelThree: UILabel!

    @IBAction func changeTextButtonTapped(_ sender: UIButton) {

        labelOne.text = "David"
        labelTwo.text = "met"
        labelThree.text = "her"
    }
}

Notes

  • This answer has been retested with Xcode 8, iOS 10, and Swift 3.
  • See my other answer if you want multi-line resizing.
  • Thanks to this answer for setting me on the right track.
Hoatzin answered 1/4, 2016 at 6:24 Comment(6)
If you're using auto-layout, this is the right answer. I was initially worried about not fully constraining the layout, but it's documented to work this way so it should be good. developer.apple.com/library/ios/documentation/UserExperience/…Glebe
gives error for add missing contrinats how to handle that?Insalubrious
@MyMasterPeice, I have retested this example in Xcode 8 and I don't get any missing constraints error. I added an image with the exact constrains that I am using. Try copying this exact example. You shouldn't get any errors.Hoatzin
@Hoatzin i havnt seen ur demo app but i tried that same thing in textview which is placed directly in content view where in this solution didnt worked but if we wrap textview in UIView then it is just perfect answer , that is tricky point which was not mentioned in answer but thats what worked for me !Insalubrious
@MyMasterPeice, Ok, I haven't used content views much, so I assumed it worked the same everywhere. Thanks for your response. I'm glad you got it working.Hoatzin
@Hoatzin yep but this may be one tricky point else this solution is better +1 :)Insalubrious
A
3

Use This Extended UILabel class:

//
//  UILabelExtended.h

//
//  Created by Prateek on 6/18/11.



#import <Foundation/Foundation.h>

/*  **********************************************************************************************
        This class inherit the class UILabel and extend the features of UILabel. 
    ********************************************************************************************** */
@interface UILabelExtended : UILabel {
   __unsafe_unretained id  customDelegate;
    id  objectInfo;
    SEL selector;
}

@property (nonatomic,assign) SEL selector;;
@property (nonatomic,assign) id  customDelegate;
@property (nonatomic,retain) id  objectInfo;
@end

@interface UILabel(UILabelCategory)
- (void)setHeightOfLabel;
- (void)setWidthOfLabel;
- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight;
- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth ;
@end

UILabelExtended.m

//
//  Created by Prateek on 6/18/11.

//

#import "UILabelExtended.h"


@implementation UILabelExtended
@synthesize selector,customDelegate, objectInfo;

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(self.selector)
        if([self.customDelegate respondsToSelector:self.selector]) {
            [self.customDelegate performSelector:self.selector withObject:self];
            return;
        }
}

- (void)dealloc {

    self.customDelegate = nil;
    self.selector = NULL;
    self.objectInfo = nil;
}
@end


@implementation UILabel(UILabelCategory)

- (void)setHeightOfLabel {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, 99999) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.height = height;
    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}


- (void)setWidthOfLabel {
    UILabel* label = self;

        //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
        //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.width = width+5;
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}

- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, maxHeight) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;

    if([label.text length] > 0) {
        if (height > maxHeight) {
            frame.size.height = maxHeight;
        }
        else {
            frame.size.height = height;
        }

    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}

- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth  {
    UILabel* label = self;

    //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        if (width > maxWidth) {
            frame.size.width = maxWidth;
        }
        else {
            frame.size.width = width;
        }
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}
@end

Use Methods: 1) set text of UILabel 2) [yourLBLObj setHeightOfLabel]; or [yourLBLObj setWidthOfLabel]; It will automatically set Height or Width according to text.

Alcaraz answered 1/6, 2013 at 4:50 Comment(2)
Thanks a lot! I liked your detailed coding. It is very helpful.Thuggee
Thanks a lot my friend. Please let me know if you have any other issue. And please vote my ansAlcaraz
A
3

you get simply calculate UILabel width for string size,try this simple code for set UILabel size

   // Single line, no wrapping;
    CGSize expectedLabelSize = [string sizeWithFont:yourFont];
 //  you get width,height in expectedLabelSize;
//expectedLabelSize.width,expectedLabelSize.height
Antons answered 1/6, 2013 at 5:0 Comment(1)
Thanks. I'll take your advice, too.Thuggee
C
1

try this

        NSString *text1 = [NSString stringWithFormat:@"%@",commentText];
        CGSize constraint1 = CGSizeMake(280, 2000);
        CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap];

        UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] ;
        lblComment.lineBreakMode = UILineBreakModeWordWrap;
        lblComment.numberOfLines = size1.height/15;
        [lblComment setFont:[UIFont systemFontOfSize:12]];
        lblComment.text = text1;
        lblComment.tag = shareObjC.userId;
            [lblComment setNeedsDisplay]
Cockatiel answered 1/6, 2013 at 7:6 Comment(0)
G
1

All you need to just put 2 lines code

lbl1.numberOfLines = 0
    lbl1.sizeToFit()

It will manage label width as per its content

Hope it helps others :)

Guggenheim answered 21/5, 2018 at 19:2 Comment(0)
O
0

You can use this piece of code for calculate label width and set it

   CGSize expectedLabelSize = [name sizeWithFont:yourfont constrainedToSize:maximumLabelSize]; 

// you can get width width height from expectedLabelSize and set accordingly

Ovid answered 1/6, 2013 at 4:48 Comment(0)
I
0

Currently i m working on IOS-8 and there is small changes i made to @Suragch answer (Need to use auto layout to make this work)

Below is the step and screenshot in result :

  1. Place the textview inside UIView and not directly inside content-view in storyboard
  2. Disable scroll of textview from storyboard
  3. Add Leading and top constraints as i have added to view in below screenshot(Trailing constraint is optional but i have added )

There is no need to add code in swift this can be done in storyboard itself.

Result : enter image description here

Insalubrious answered 17/2, 2017 at 12:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.