How to adjust a label size to fit the length of the text

前端 未结 8 691
无人及你
无人及你 2020-12-20 12:27

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

相关标签:
8条回答
  • 2020-12-20 12:30

    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.

    0 讨论(0)
  • 2020-12-20 12:32

    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 :

    0 讨论(0)
  • 2020-12-20 12:34

    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]
    
    0 讨论(0)
  • 2020-12-20 12:37

    Xcode 8 and iOS 10

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

    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.

    Here is what the constraints look like:

    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.
    0 讨论(0)
  • 2020-12-20 12:37

    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 :)

    0 讨论(0)
  • 2020-12-20 12:51

    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

    0 讨论(0)
提交回复
热议问题