Resize UILabel based on content

I have a UILabel, his text size has the property

title.adjustsFontSizeToFitWidth = YES;

that prevents me from using standard methods to resize the UILabel. I read on another post here that I’m supposed to use the function

  • Download and execute iOS code dynamically at runtime
  • Unwind segue doesn't dismiss adaptive popover presentation when not modal
  • Using MMDrawer only in sub navigation view
  • Find Object with Property in Array
  • How to toggle between .h and .m in Xcode 4
  • iOS 8 Photos framework. Access photo metadata
  • sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode
    

    from this answer: How to figure out the font size of a UILabel when -adjustsFontSizeToFitWidth is set to YES?

    Now, i can’t figure out how to make it work.. this is the actual code

    UIFont *font = [UIFont fontWithName:@"Marker Felt" size:200];
    UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 20.0)];
    title.text = @"this is a long title that should be resized";
    title.font = font;
    title.numberOfLines = 1;
    title.adjustsFontSizeToFitWidth = YES;
    
    CGFloat pointSize = 0.0;
    CGSize size = [title.text sizeWithFont:font 
                               minFontSize:title.minimumFontSize 
                            actualFontSize:&pointSize 
                                  forWidth:width 
                             lineBreakMode:title.lineBreakMode];
    title.frame = CGRectMake(title.frame.origin.x, 
                             title.frame.origin.y, 
                             size.width, 
                             size.height);
    

    The UILabel get resized wrongly, as if the font size it’s still 200..
    Any clues? Thanks!

    5 Solutions Collect From Internet About “Resize UILabel based on content”

    I’d suggest filing this as a bug.

    The size returned by -sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: has the correct width, but not the height does not account for the actual font size.

    It seems likely that UILabel also has this bug. Changing the size of a label to match the height of the text in a font of the size returned by -sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: will incorrectly vertically position the text within the label.

    A work-around is to calculate the correct height, and change the font on the label to with the actual font size:

    CGFloat pointSize = 0.0f;
    CGRect frame = title.frame;
    frame.size = [title.text sizeWithFont:font
                              minFontSize:title.minimumFontSize
                           actualFontSize:&pointSize
                                 forWidth:width
                            lineBreakMode:title.lineBreakMode];
    UIFont *actualFont = [UIFont fontWithName:@"Marker Felt" size:pointSize];
    CGSize sizeWithCorrectHeight = [title.text sizeWithFont:actualFont];
    frame.size.height = sizeWithCorrectHeight.height;
    title.frame = frame;
    title.font = actualFont;
    

    I have some code you could use on my github, check it out, it’s a category for UILabel, you need to set the frame width and when you can resizeToFit on the UILabel, it adjusts the height to fit the content, and returns the y position of the end of the label so you can adjust any content appearing after it.

    https://gist.github.com/1005520

    Try to create font with smaller fontSize. For example:

    UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];
    

    but to actualFontSize pass link to CGFloat == 200.

    UPDATED:

    try this then:

    UIFont *font = [UIFont fontWithName:@"Marker Felt" size:20];
    UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, width, 20.0)];
    title.text = @"this is a long title that should be resized";
    title.font = font;
    title.numberOfLines = 1;
    title.adjustsFontSizeToFitWidth = YES;
    
    CGFloat pointSize = 0.0;
    CGSize size = [title.text sizeWithFont:font minFontSize:title.minimumFontSize actualFontSize:&pointSize forWidth:width lineBreakMode:title.lineBreakMode];
    title.frame = CGRectMake(title.frame.origin.x, title.frame.origin.y, size.width, size.height);
    font = [UIFont fontWithName:@"Marker Felt" size:200];
    title.font = font;
    
    UILabel * label = [[UILabel alloc] init];
            [label setNumberOfLines:0];
            label.text=[detailDict valueForKey:@"method"];
            [label setFont:[UIFont fontWithName:@"Georgia" size:16.0]];
            CGSize labelsize=[label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(250, 1000.0) lineBreakMode:UILineBreakModeWordWrap];
            int y=0;
            label.frame=CGRectMake(38, y, 245, labelsize.height);
            [label setBackgroundColor:[UIColor clearColor]];
            [label setTextColor:[UIColor whiteColor]];
            scrollView.showsVerticalScrollIndicator = NO;
            y+=labelsize.height;
            [scrollView setContentSize:CGSizeMake(200,y+50)];
            [scrollView addSubview:label];
            [label release];
    

    I think you should use this code and i am using the label on scrollview for a big text you can also do so

    Have you tried intrinsicContentSize?

        myLable.numberOfLines = 0
        myLable.frame = CGRect(x: 10, y: 10, width: 300, height: lblSuperscript.intrinsicContentSize().height)