1. 程式人生 > >iOS開發:boundingRectWithSize計算文字大小問題

iOS開發:boundingRectWithSize計算文字大小問題

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

對於這兩個方法有相同的引數:

引數一:CGSize)size  表示計算文字的最大寬高、就是限制的最大高度、寬度,一般情況下我們設定最大的寬度、高度不限制CGSizeMake(getScreenWidth(), CGFLOAT_MAX),注意:限制的寬度不同,計算的高度結果也不同

引數二:NSStringDrawingOptions表示計算的型別

NSStringDrawingUsesLineFragmentOrigin繪製文字時使用 line fragement origin 而不是 baseline origin。一般使用這項

NSStringDrawingUsesFontLeading 根據字型計算高度

NSStringDrawingUsesDeviceMetrics 使用象形文字計算高度

NSStringDrawingTruncatesLastVisibleLine 如果NSStringDrawingUsesLineFragmentOrigin設定,這個選項中沒有用

引數三: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:檢測字型和限制的寬度是否設定正確

解決辦法2:可以設定NSStringDrawingOptions options =  NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;

解決辦法3:當你是把獲得的高度來佈局控制元件的View的高度的時候,需要把獲得size = [string boundingRectWithSize:CGSizeMake(getScreenWidth(), CGFLOAT_MAX) options:options context:nil].size轉化為ceilf(size.height)

解決辦法4:由於這個方法計算字串的大小的通過取得字串的size來計算, 如果你計算的字串中包含\n\r 這樣的字元,也只會把它當成字元來計算。但是在顯示的時候就是\n是轉義字元,那麼顯示的計算的高度就不一樣了,所以可以採用 計算的高度 = boundingRectWithSize計算出來的高度 + \n轉義字元出現的個數 * 單行文字的高度。

以上是個人經驗以及網站資料總結,有什麼問題希望大家相互交流,只為大家提供更多的資源分享,讓我們的問題不在頭痛



文/崖邊樹(簡書作者)
原文連結:http://www.jianshu.com/p/0734d2fa74bd