Search code examples
iosiphoneobjective-cuilabel

UILabel - auto-size label to fit text?


Is it possible to auto-resize the UILabel box/bounds to fit the contained text? (I don't care if it ends up larger than the display)

So if a user enters "hello" or "my name is really long i want it to fit in this box", it is never truncated and the label is 'widened' accordingly?


Solution

  • Please check out my gist where I have made a category for UILabel for something very similar, my category lets a UILabel stretch it's height to show all the content: https://gist.github.com/1005520

    Or check out this post: https://stackoverflow.com/a/7242981/662605

    This would stretch the height, but you can change it around easily to work the other way and stretch the width with something like this, which is I believe what you want to do:

    @implementation UILabel (dynamicSizeMeWidth)
    
    - (void)resizeToStretch{
        float width = [self expectedWidth];
        CGRect newFrame = [self frame];
        newFrame.size.width = width;
        [self setFrame:newFrame];
    }
    
    - (float)expectedWidth{
        [self setNumberOfLines:1];
    
        CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);
    
        CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                                constrainedToSize:maximumLabelSize
                                                lineBreakMode:[self lineBreakMode]]; 
        return expectedLabelSize.width;
    }
    
    @end
    

    You could more simply use the sizeToFit method available from the UIView class, but set the number of lines to 1 to be safe.


    iOS 6 update

    If you are using AutoLayout, then you have a built in solution. By setting the number of lines to 0, the framework will resize your label appropriately (adding more height) to fit your text.


    iOS 8 update

    sizeWithFont: is deprecated so use sizeWithAttributes: instead:

    - (float)expectedWidth{
        [self setNumberOfLines:1];
    
        CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
    
        return expectedLabelSize.width;
    }