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;
}