How to calculate UILabel height dynamically? How to calculate UILabel height dynamically? ios ios

How to calculate UILabel height dynamically?


Try this

// UILabel *myLabel;CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font                             constrainedToSize:myLabel.frame.size                                 lineBreakMode:NSLineBreakByWordWrapping];CGFloat labelHeight = labelSize.height;int lines = [myLabel.text sizeWithFont:myLabel.font                      constrainedToSize:myLabel.frame.size                          lineBreakMode:NSLineBreakByWordWrapping].height/16;              // '16' is font size

or

int lines = labelHeight/16;NSLog(@"lines count : %i \n\n",lines);  

or

int lines = [myLabel.text sizeWithFont:myLabel.font                      constrainedToSize:myLabel.frame.size                          lineBreakMode:UILineBreakModeWordWrap].height /myLabel.font.pointSize; //fetching font size from font

By Using Categories, Just Create the category class named as

UILabel+UILabelDynamicHeight.h

UILabel+UILabelDynamicHeight.m

No more tension about the height calculation. Please review the below implementation.

Updates for iOS7 & Above,iOS 7 below : Dynamically calculate the UILabel height

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)#define iOS7_0 @"7.0"

UILabel+UILabelDynamicHeight.h

#import <UIKit/UIKit.h>@interface UILabel (UILabelDynamicHeight)#pragma mark - Calculate the size the Multi line Label/*====================================================================*/    /* Calculate the size of the Multi line Label *//*====================================================================*//** *  Returns the size of the Label * *  @param aLabel To be used to calculte the height * *  @return size of the Label */ -(CGSize)sizeOfMultiLineLabel;@end

UILabel+UILabelDynamicHeight.m

#import "UILabel+UILabelDynamicHeight.h"@implementation UILabel (UILabelDynamicHeight)#pragma mark - Calculate the size,bounds,frame of the Multi line Label/*====================================================================*//* Calculate the size,bounds,frame of the Multi line Label *//*====================================================================*//** *  Returns the size of the Label * *  @param aLabel To be used to calculte the height * *  @return size of the Label */-(CGSize)sizeOfMultiLineLabel{    //Label text    NSString *aLabelTextString = [self text];    //Label font    UIFont *aLabelFont = [self font];    //Width of the Label    CGFloat aLabelSizeWidth = self.frame.size.width;    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {        //version < 7.0        return [aLabelTextString sizeWithFont:aLabelFont                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)                                lineBreakMode:NSLineBreakByWordWrapping];    }    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {        //version >= 7.0        //Return the calculated size of the Label        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)                                              options:NSStringDrawingUsesLineFragmentOrigin                                           attributes:@{                                                        NSFontAttributeName : aLabelFont                                                        }                                              context:nil].size;    }    return [self bounds].size;}@end


Calling -sizeToFit on UILabel instance will automatically resize it to fit text it displays, no calculating required. If you need the size, you can get it from label's frame property after that.

label.numberOfLines = 0; // allows label to have as many lines as neededlabel.text = @"some long text";[label sizeToFit];NSLog(@"Label's frame is: %@", NSStringFromCGRect(label.frame));


To summarize, you can calculate the height of a label by using its string and calling boundingRectWithSize. You must provide the font as an attribute, and include .usesLineFragmentOrigin for multi-line labels.

let labelWidth = label.frame.widthlet maxLabelSize = CGSize(width: labelWidth, height: CGFloat.greatestFiniteMagnitude)let actualLabelSize = label.text!.boundingRect(with: maxLabelSize, options: [.usesLineFragmentOrigin], attributes: [.font: label.font], context: nil)let labelHeight = actualLabelSize.height(withWidth:labelWidth)

Some extensions to do just that:

Swift Version:

extension UILabel {    func textHeight(withWidth width: CGFloat) -> CGFloat {        guard let text = text else {            return 0        }        return text.height(withWidth: width, font: font)    }    func attributedTextHeight(withWidth width: CGFloat) -> CGFloat {        guard let attributedText = attributedText else {            return 0        }        return attributedText.height(withWidth: width)    }}extension String {    func height(withWidth width: CGFloat, font: UIFont) -> CGFloat {        let maxSize = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)        let actualSize = self.boundingRect(with: maxSize, options: [.usesLineFragmentOrigin], attributes: [.font : font], context: nil)        return actualSize.height    }}extension NSAttributedString {    func height(withWidth width: CGFloat) -> CGFloat {        let maxSize = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)        let actualSize = boundingRect(with: maxSize, options: [.usesLineFragmentOrigin], context: nil)        return actualSize.height    }}

Objective-C Version:

UILabel+Utility.h

#import <UIKit/UIKit.h>@interface UILabel (Utility)- (CGFloat)textHeightForWidth:(CGFloat)width;- (CGFloat)attributedTextHeightForWidth:(CGFloat)width;@end

UILabel+Utility.m

@implementation NSString (Utility)- (CGFloat)heightForWidth:(CGFloat)width font:(UIFont *)font {    CGSize maxSize = CGSizeMake(width, CGFLOAT_MAX);    CGSize actualSize = [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil].size;    return actualSize.height;}@end@implementation NSAttributedString (Utility)- (CGFloat)heightForWidth:(CGFloat)width {    CGSize maxSize = CGSizeMake(width, CGFLOAT_MAX);    CGSize actualSize = [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;    return actualSize.height;}@end@implementation UILabel (Utility)- (CGFloat)textHeightForWidth:(CGFloat)width {    return [self.text heightForWidth:width font:self.font];}- (CGFloat)attributedTextHeightForWidth:(CGFloat)width {    return [self.attributedText heightForWidth:width];}@end