uilabel 自行撑开高度_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來設置高度(歡迎高手指正)
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是一個獲取屏幕寬度的宏定義
boundingRectWithSize方法介紹:
size
限制最大寬高, 雖然是自適應, 但是需要限制最大的寬度和高度
options
一個枚舉, 繪制自定義方式字符串的選項,可以互相組合。例如:
NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
enum {
NSStringDrawingTruncatesLastVisibleLine = 1 << 5,
NSStringDrawingUsesLineFragmentOrigin = 1 << 0,
NSStringDrawingUsesFontLeading = 1 << 1,
NSStringDrawingUsesDeviceMetrics = 1 << 3,
};typedef NSInteger NSStringDrawingOptions;
NSStringDrawingTruncatesLastVisibleLine :
如果文本內容超出指定的矩形限制,文本將被截去并在最后一個字符后加上省略號 . 如果三選項沒有選擇, 忽略此選項
NSStringDrawingUsesLineFragmentOrigin :
整個文本將以每行組成的矩形為單位計算整個文本的尺寸
NSStringDrawingUsesFontLeading :
以字體間的行距(leading,行距:從一行文字的底部到另一行文字底部的間距。)來計算高度
NSStringDrawingUsesDeviceMetrics :
計算布局時使用圖像符號邊界, 而不是排版的邊界
attributes
應用于字符串的文本樣式字典屬性
context
控制如何調整字間距和縮放。對象包含的信息將用于文本繪制。該參數可為 nil
返回值
返回一個矩形CGRect, 這個矩形為文字所占的矩形
總結
以上是生活随笔為你收集整理的uilabel 自行撑开高度_UILabel文本高度计算的那些事儿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10重置失败未做更改怎么办 win
- 下一篇: java thread_Java(多线