iOS 動態計算行高,寬等

來源:互聯網
上載者:User

標籤:寬度   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比如字型、文字樣式 NSFontAttributeNameNSParagraphStyleAttributeName參數四: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 動態計算行高,寬等

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.