UILabel文本高度計算的那些事兒

1. 計算文本在一行高度內的寬度

// 段落樣式
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = 6.0;

// 清除掉換行符(或者還要清除空白符,這個看本身需求)
// 要處理掉換行符,不然得不到正確的高度
NSString *intro = [self.columnDict.head.intro copy]; // 這個數據就是文本
intro = [intro stringByReplacingOccurrencesOfString:@"\r" withString:@""];
intro = [intro stringByReplacingOccurrencesOfString:@"\n" withString:@""];

CGRect introRect = [intro boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 20) 
                          options:0 attributes:@{
                                  NSFontAttributeName:font(14),
                                  NSParagraphStyleAttributeName:paragraphStyle
                                  } context:nil];
 
CGFloat width = introRect.size.width;

// 若是width是小數,小數部分的寬度不會被渲染,不夠一個像素,因此最好向上取整
width = ceil(width);

boundingRectWithSize的第一個參數是CGSize. 通常會設置寬度固定,高度CGFLOAT_MAX來獲取在這種顯示寬度內的文本高度;或者設置寬度CGFLOAT_MAX,高度固定,來獲取某個高度內的文本寬度。好比上邊的一行高度內,文本有多長佈局

2. 固定寬度,行數的文本高度(沒有設置行間距的狀況下)

UILabel *label = [[UILabel alloc] init];
label.numberOfLines = 2;
label.text = self.columnDict.head.intro;
[label sizeToFit];

CGFloat height = label.bounds.size.height;

利用一個UILabel對象,來獲取渲染後的文本size,高度。字體

假設固定行數爲2行,若是文本內容比較多,就能夠直接用下邊的fontLineHeight * 2來設置高度(歡迎高手指正)code

3. 固定寬度,行數的文本高度(有設置行間距的狀況下)

CGFloat fontLineHeight = _descLabel.font.lineHeight; // 不一樣系統,字體下高度會和字號大小不一樣

// 2行,行間距6
CGFloat height = fontLineHeight * 2 + 6;

// 1行,行間距6
CGFloat height = fontLineHeight + 6;

以上兩種狀況,假設一開始設定高度爲2行,可是文本只有一行的時候,那麼就直接使用fontLineHeight這個高度來設置Label的高度對象

4. 固定寬度,純粹獲取文本高度

CGRect introRect = [intro boundingRectWithSize:CGSizeMake(kScreenWidth, CGFLOAT_MAX) 
                          options:0 attributes:@{
                                  NSFontAttributeName:font(14),
                                  NSParagraphStyleAttributeName:paragraphStyle
                                  } context:nil];
                                  
CGFloat height = introRect.size.height;

kScreenWidth是一個獲取屏幕寬度的宏定義ci

boundingRectWithSize方法介紹:字符串

  • size

    限制最大寬高, 雖然是自適應, 可是須要限制最大的寬度和高度
  • options

    一個枚舉, 繪製自定義方式字符串的選項,能夠互相組合。例如:
    NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
    enum { 
    NSStringDrawingTruncatesLastVisibleLine = 1 << 5, 
    NSStringDrawingUsesLineFragmentOrigin = 1 << 0, 
    NSStringDrawingUsesFontLeading = 1 << 1, 
    NSStringDrawingUsesDeviceMetrics = 1 << 3,
    };typedef NSInteger NSStringDrawingOptions;
    • NSStringDrawingTruncatesLastVisibleLine :string

      若是文本內容超出指定的矩形限制,文本將被截去並在最後一個字符後加上省略號 . 若是三選項沒有選擇, 忽略此選項
    • NSStringDrawingUsesLineFragmentOrigin :it

      整個文本將以每行組成的矩形爲單位計算整個文本的尺寸
    • NSStringDrawingUsesFontLeading :io

      以字體間的行距(leading,行距:從一行文字的底部到另外一行文字底部的間距。)來計算高度
    • NSStringDrawingUsesDeviceMetrics :table

      計算佈局時使用圖像符號邊界, 而不是排版的邊界
  • attributes

    應用於字符串的文本樣式字典屬性
  • context

    控制如何調整字間距和縮放。對象包含的信息將用於文本繪製。該參數可爲 nil
  • 返回值

    返回一個矩形CGRect, 這個矩形爲文字所佔的矩形
相關文章
相關標籤/搜索