iOS UILabel文本高度計算

boundingRectWithSize計算文本高度?

CGRect stringRect = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT)

options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)

attributes:@{ NSFontAttributeName : font }

context:nil];

size: 自適應(yīng)尺寸,提供一個寬度,去自適應(yīng)高度场航。

options:文本繪制時的附加選項,NSStringDrawingOptions有四種類型:

1.NSStringDrawingTruncatesLastVisibleLine

2.NSStringDrawingUsesLineFragmentOrigin

3.NSStringDrawingUsesFontLeading

4.NSStringDrawingUsesDeviceMetrics

通常使用NSStringDrawingUsesLineFragmentOrigin巷折,釋義為:整個文本將以每行組成的矩形為單位計算整個文本的尺寸。

NSStringDrawingUsesFontLeading吨艇,釋義為:使用字體的行間距來計算文本占用的范圍偿洁,即每一行的底部到下一行的底部的距離計算。

NSStringDrawingUsesDeviceMetric湘今,釋義為:將文字以圖像符號計算文本占用范圍己单,而不是以字符計算唉窃。也即是以每一個字體所占用的空間來計算文本范圍。

NSStringDrawingTruncatesLastVisibleLine纹笼,釋義為:當(dāng)文本不能適合的放進指定的邊界之內(nèi)纹份,則自動在最后一行添加省略符號。如果NSStringDrawingUsesLineFragmentOrigin沒有設(shè)置,則該選項不生效蔓涧。

attributes:根本文字的哪一種屬性來進行計算件已。

context:繪制文本上下文, 一般傳nil采用系統(tǒng)默認元暴。

舉例子:

//參數(shù)1:UILabel的大小

//參數(shù)2:UILabel上文字內(nèi)容

//參數(shù)3:文字的字體大小

- (CGSize)labelRectWithSize:(CGSize)size LabelText:(NSString *)labelText Font:(UIFont *)font

{

NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];

CGSize actualsize = [labelText boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin?| NSStringDrawingUsesFontLeading attributes:dic? ? ? context:nil].size; return actualsize;

}

//設(shè)置UILabel寬度和高度

- (CGSize)setLabelWidthWithHeight:(NSString *)str font:(UIFont*)font with:(CGFloat)width with:(CGFloat)height

{

CGSize size1 = CGSizeMake(width, height);

//獲取當(dāng)前文本的屬性

NSDictionary *tdic = [NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName,nil];

CGSize labelSize = [str boundingRectWithSize:size1 options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:tdic context:nil].size;

return labelSize;

}

// 將UILabel根據(jù)內(nèi)容自適應(yīng)寬度變化,但高度是固定的篷扩,為30。

- (CGSize)sizeWithString:(NSString *)string font:(UIFont *)font

{

CGRect rect = [string boundingRectWithSize:CGSizeMake(MAXFLOAT, 30)options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font}context:nil];

return rect.size;

}

更新:

以上的方法茉盏,在使用過程中鉴未,尤其是在帶有富文本的文本高度計算中會出現(xiàn)問題篮洁,于是做了以下方法處理裳扯,在文本一行和多行的情況下分別作處理:

/**

根據(jù)文本內(nèi)容計算高度,并設(shè)置行間距芥炭、字體名稱享怀、限制寬高組成富文本羽峰,顯示在UILabel上

@param text 文本內(nèi)容

@param lineSpace 行間距

@param fontName 字體名稱

@param size 文本內(nèi)容的限制寬高

@param label 文本內(nèi)容顯示的label

@return 內(nèi)容高度

*/

- (CGFloat )calculateLabelHeightWithText:(NSString *)text lineSpace:(NSInteger )lineSpace fontName:(UIFont *)fontName size:(CGSize )size label:(UILabel *)label

{

CGFloat height = 0;

if (text.length > 0) {

// 計算內(nèi)容高度,判斷顯示幾行

NSString *firstWord = [text substringToIndex:1];

CGFloat oneRowHeight = [firstWord sizeWithAttributes:@{NSFontAttributeName:fontName}].height;

NSDictionary *attributes = @{NSFontAttributeName:fontName};

CGSize textSize = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;

CGFloat rows = textSize.height / oneRowHeight;

if (rows == 1) {

lineSpace = 0;

height = oneRowHeight;

} else if (rows > 1) {

height = (oneRowHeight + lineSpace) * rows;

}

if (label) {

NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:text];

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];

[paragraphStyle setLineSpacing:lineSpace];

[string addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0,text.length)];

[label setAttributedText:string];

}

}

return height;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趟咆,一起剝皮案震驚了整個濱河市添瓷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌值纱,老刑警劉巖鳞贷,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虐唠,居然都是意外死亡搀愧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門疆偿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咱筛,“玉大人,你說我怎么就攤上這事杆故⊙嘎幔” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵处铛,是天一觀的道長饲趋。 經(jīng)常有香客問我,道長撤蟆,這世上最難降的妖魔是什么奕塑? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮家肯,結(jié)果婚禮上龄砰,老公的妹妹穿的比我還像新娘。我一直安慰自己讨衣,他們只是感情好寝贡,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布扒披。 她就那樣靜靜地躺著,像睡著了一般圃泡。 火紅的嫁衣襯著肌膚如雪碟案。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天颇蜡,我揣著相機與錄音价说,去河邊找鬼。 笑死风秤,一個胖子當(dāng)著我的面吹牛鳖目,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缤弦,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼领迈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碍沐?” 一聲冷哼從身側(cè)響起狸捅,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎累提,沒想到半個月后尘喝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡斋陪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年朽褪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无虚。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡缔赠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出友题,到底是詐尸還是另有隱情嗤堰,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布咆爽,位于F島的核電站梁棠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斗埂。R本人自食惡果不足惜符糊,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呛凶。 院中可真熱鬧男娄,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尸折,卻和暖如春啰脚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背实夹。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工橄浓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亮航。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓荸实,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缴淋。 傳聞我的和親對象是個殘疾皇子准给,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345