標籤:寬度 dict har ons 問題 gem 情況 最大 限制
UILabel有兩個計算文字大小的方法:1.針對對富文本計算NSAttributedString
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary*)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);
2.針對與普通文本計算NSString
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 6_0);
對於這兩個方法有相同的參數:
參數一:size表示計算文本的最大寬高(就是限制的最大高度、寬度),一般情況下我們設定最大的寬度、高度不限制
CGSizeMake(getScreenWidth(), CGFLOAT_MAX),注意:限制的寬度不同,計算的高度結果也不同。參數二: options表示計算的類型
NSStringDrawingUsesLineFragmentOrigin:繪製文本時使用 line fragement origin 而不是 baseline origin。一般使用這項。整個文本將以每行組成的矩形為單位計算整個文本的尺寸( The specified origin is the line fragment origin, not the base line origin)
NSStringDrawingUsesFontLeading:根據字型計算高度,使用字型的行間距來計算文本佔用的範圍,即每一行的底部到下一行的底部的距離計算 ( Uses the font leading for calculating line heights )
NSStringDrawingUsesDeviceMetrics:使用表意字元計算高度,將文字以映像符號計算文本佔用範圍,而不是以字元計算。也即是以每一個字型所佔用的空間來計算文本範圍 (Uses image glyph bounds instead of typographic bounds )
NSStringDrawingTruncatesLastVisibleLine:如果NSStringDrawingUsesLineFragmentOrigin設定,這個選項沒有用,當文本不能適合的放進指定的邊界之內,則自動在最後一行添加省略符號。如果NSStringDrawingUsesLineFragmentOrigin沒有設定,則該選項不生效 (Truncates and adds the ellipsis character to the last visible line if the text doesn‘t fit into the bounds specified. Ignored if NSStringDrawingUsesLineFragmentOrigin is not also set. )
參數三:attributes 表示富文本的屬性
NSAttributedString.h比如字型、文字樣式
NSFontAttributeName、
NSParagraphStyleAttributeName參數四:NSStringDrawingContext
When stringDrawingContext=nil, it‘s equivalent of passing the default instance initialized with [[NSStringDrawingContext alloc] init] context
上下文,包括一些資訊,例如如何調整字間距以及縮放。該參數一般可為 nil 。問題:有時候計算文字的時候大小和實際的大小不一樣?
解決辦法1:檢測字型和限制的寬度是否設定正確(樓主載在這裡/(ㄒoㄒ)/~~)
解決辦法2:可以設定NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
(注意:swift中要寫這樣的組合是不支援的,點擊這裡查看解決方案www.jianshu.com/p/545f7f1d8741)
解決辦法3:當你是把獲得的高度來布局控制項的View的高度的時候,需要把獲得size = [string boundingRectWithSize:CGSizeMake(getScreenWidth(), CGFLOAT_MAX) options:options context:nil].size轉化為ceilf(size.height)。
解決辦法4:由於這個方法計算字串的大小的通過取得字串的size來計算, 如果你計算的字串中包含\n\r 這樣的字元,也只會把它當成字元來計算。但是在顯示的時候就是\n是逸出字元,那麼顯示的計算的高度就不一樣了,所以可以採用:計算的高度 = boundingRectWithSize計算出來的高度 + \n\r逸出字元出現的個數 * 單行文本的高度。
擴充:
TextKit學習(四)通過boundingRectWithSize:options:attributes:context:計算文本尺寸:http://blog.csdn.net/jymn_chen/article/details/10949279Text Kit學習(入門和進階)http://www.cocoachina.com/industry/20131028/7250.html
iOS 動態計算行高,寬等