iOS中怎樣計算一段文字的高度

在很多情景下都會遇到根據(jù)文字的內(nèi)容來動態(tài)計算一個控件的大小。

本文以固定控件寬度,動態(tài)計算文字高度為示例,其它情況可以同理。

計算一段文字的高度需要固定控件顯示寬度,以及確定文字的字體。

創(chuàng)建一個NSString的分類,方法中需要傳入字體以及寬度兩個參數(shù)。

如果文字段落設置了行間距,那么計算高度的時候也要設置行間距的屬性。

下面是一個實現(xiàn)了該功能的NSString分類

@interface NSString (ZCLSize)

- (CGFloat)zcl_heightWithFont:(UIFont *)font constrainedToWidth:(CGFloat)width;

- (CGFloat)zcl_heightWithFont:(UIFont *)font constrainedToWidth:(CGFloat)width lineSpacing:(CGFloat)lineSpacing;

@end


@implementation NSString (ZCLSize)

- (CGFloat)zcl_heightWithFont:(UIFont *)font constrainedToWidth:(CGFloat)width {
    UIFont *textFont = font ? font : [UIFont systemFontOfSize:[UIFont systemFontSize]];
    
    CGSize textSize;
    
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.lineBreakMode = NSLineBreakByWordWrapping;
    NSDictionary *attributes = @{NSFontAttributeName: textFont,
                                 NSParagraphStyleAttributeName: paragraph};
    textSize = [self boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                  options:(NSStringDrawingUsesLineFragmentOrigin |
                                           NSStringDrawingTruncatesLastVisibleLine)
                               attributes:attributes
                                  context:nil].size;
    
    return ceil(textSize.height);
}

- (CGFloat)zcl_heightWithFont:(UIFont *)font constrainedToWidth:(CGFloat)width lineSpacing:(CGFloat)lineSpacing {
    UIFont *textFont = font ? font : [UIFont systemFontOfSize:[UIFont systemFontSize]];
    
    CGSize textSize;
    
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.lineBreakMode = NSLineBreakByWordWrapping;
    paragraph.lineSpacing  = lineSpacing;
    NSDictionary *attributes = @{NSFontAttributeName: textFont,
                                 NSParagraphStyleAttributeName: paragraph};
    textSize = [self boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                  options:(NSStringDrawingUsesLineFragmentOrigin |
                                           NSStringDrawingTruncatesLastVisibleLine)
                               attributes:attributes
                                  context:nil].size;
    
    return ceil(textSize.height);
}

@end

使用示例:

文字沒有設置行間距。

    NSString *showText = @"我不是詩人,所以,只能夠把愛你寫進程序,\n當作不可解的密碼,作為我一個人知道的秘密。\n我以為你是我的唯一,過了很久才發(fā)現(xiàn),你不是我獨占的服務器,\n我可以傳遞,卻什么都不能夠取回,大師說,此算法不可逆。\n我想析構(gòu)我自己,卻沒有多少勇氣,只能夠注釋掉關于你的記憶,\n想尋找你的信息,突然發(fā)現(xiàn),你已經(jīng)不在我的域。";
    UILabel *labelContent = [[UILabel alloc]initWithFrame:CGRectMake(14, 64, CGRectGetWidth(self.view.frame) - 28, CGRectGetHeight(self.view.frame) - 64 - 49)];
    [self.view addSubview:labelContent];
    labelContent.numberOfLines = 0;
    [labelContent setTextColor:[UIColor blackColor]];
    [labelContent setFont:[UIFont systemFontOfSize:15]];
    [labelContent.layer setBorderWidth:1.0];
    [labelContent.layer setBorderColor:[UIColor redColor].CGColor];
    
    [labelContent setText:showText];

    CGFloat showTextHeight = [showText zcl_heightWithFont:labelContent.font constrainedToWidth:CGRectGetWidth(self.view.frame) - 28];
    labelContent.frame = CGRectMake(14, 64, CGRectGetWidth(self.view.frame) - 28, showTextHeight);
Paste_Image.png

文字設置了行間距

    NSString *showText = @"我不是詩人,所以,只能夠把愛你寫進程序,\n當作不可解的密碼,作為我一個人知道的秘密。\n我以為你是我的唯一,過了很久才發(fā)現(xiàn),你不是我獨占的服務器,\n我可以傳遞,卻什么都不能夠取回,大師說,此算法不可逆。\n我想析構(gòu)我自己,卻沒有多少勇氣,只能夠注釋掉關于你的記憶,\n想尋找你的信息,突然發(fā)現(xiàn),你已經(jīng)不在我的域。";
    UILabel *labelContent = [[UILabel alloc]initWithFrame:CGRectMake(14, 64, CGRectGetWidth(self.view.frame) - 28, CGRectGetHeight(self.view.frame) - 64 - 49)];
    [self.view addSubview:labelContent];
    labelContent.numberOfLines = 0;
    [labelContent setTextColor:[UIColor blackColor]];
    [labelContent setFont:[UIFont systemFontOfSize:15]];
    [labelContent.layer setBorderWidth:1.0];
    [labelContent.layer setBorderColor:[UIColor redColor].CGColor];

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:showText];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    [paragraphStyle setLineSpacing:12];
    [attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [showText length])];
    labelContent.attributedText = attributedString;

    CGFloat showTextHeight = [showText zcl_heightWithFont:labelContent.font constrainedToWidth:CGRectGetWidth(self.view.frame) - 28 lineSpacing:12];
    labelContent.frame = CGRectMake(14, 64, CGRectGetWidth(self.view.frame) - 28, showTextHeight);
Paste_Image.png

總結(jié)

  • 本文給出了固定文字顯示寬度以及文字字體,動態(tài)計算文字顯示高度的方法。
  • 同理可以得出固定顯示高度,動態(tài)計算文字寬度的方法。
  • 示例中同時也給出了怎樣設置文字的行間距的方法。另一篇博客中也有介紹到。http://m.itdecent.cn/p/3bc837edee1b
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • “青衣水袖半遮顏,臺上風光唱彩詞。演盡紅塵千萬事,卻為過客未曾歡?!? 戲子憐人,已成為酸楚而悲傷的角色,她們永...
    gloaming_f22e閱讀 682評論 0 2
  • 一覺夢醒,恍如隔世 人為何不能留于夢中? 夢中,冷雨連綿,天地將傾 天空昏暗不分日夜 人人面臨生死隔絕 可是,你走...
    清珞兮閱讀 292評論 0 4
  • 今天又一次的失敗我很坦然,我知道了我其實并沒有這么厲害,我只是害怕的多了幾分,然后想要去努力,便亂了陣腳,...
    魚魚芋頭閱讀 329評論 0 0
  • 之一包菜 為了抵御寒冷,在冰天雪地,將自己緊緊包裹。每一顆包菜,象一個巨大的拳頭,砸向高高的天空,落在厚實的大地。...
    閑不語閱讀 440評論 0 2

友情鏈接更多精彩內(nèi)容