UILabel有兩個計算文字大小的方法:
1.針對對富文本計算NSAttributedString
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 6_0);
2.針對與普通文本計算NSString
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
對于這兩個方法有相同的參數(shù):
參數(shù)一:CGSize)size? 表示計算文本的最大寬高糜俗、就是限制的最大高度锦茁、寬度堂氯,一般情況下我們設(shè)置最大的寬度茫死、高度不限制CGSizeMake(getScreenWidth(), CGFLOAT_MAX)勾笆,注意:限制的寬度不同蒲犬,計算的高度結(jié)果也不同
參數(shù)二:NSStringDrawingOptions表示計算的類型
NSStringDrawingUsesLineFragmentOrigin繪制文本時使用 line fragement origin 而不是 baseline origin缀辩。一般使用這項
NSStringDrawingUsesFontLeading 根據(jù)字體計算高度
NSStringDrawingUsesDeviceMetrics 使用象形文字計算高度
NSStringDrawingTruncatesLastVisibleLine 如果NSStringDrawingUsesLineFragmentOrigin設(shè)置,這個選項中沒有用
參數(shù)三:attributes 表示富文本的屬性 NSAttributedString.h比如字體蛛枚、文字樣式等NSFontAttributeName、NSParagraphStyleAttributeName
參數(shù)四:NSStringDrawingContext
When stringDrawingContext=nil, it's equivalent of passing the default instance initialized with [[NSStringDrawingContext alloc] init] context上下文脸哀。包括一些信息蹦浦,例如如何調(diào)整字間距以及縮放。該參數(shù)一般可為 nil 撞蜂。
問題:有時候計算文字的時候大小和實際的大小不一樣盲镶?
解決辦法1:檢測字體和限制的寬度是否設(shè)置正確
解決辦法2:可以設(shè)置NSStringDrawingOptions options =? NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
解決辦法3:當(dāng)你是把獲得的高度來布局控件的View的高度的時候,需要把獲得size = [string boundingRectWithSize:CGSizeMake(getScreenWidth(), CGFLOAT_MAX) options:options context:nil].size轉(zhuǎn)化為ceilf(size.height)
解決辦法4:由于這個方法計算字符串的大小的通過取得字符串的size來計算, 如果你計算的字符串中包含\n\r 這樣的字符蝌诡,也只會把它當(dāng)成字符來計算溉贿。但是在顯示的時候就是\n是轉(zhuǎn)義字符,那么顯示的計算的高度就不一樣了浦旱,所以可以采用 計算的高度 = boundingRectWithSize計算出來的高度 + \n轉(zhuǎn)義字符出現(xiàn)的個數(shù) * 單行文本的高度宇色。