在IOS開發中例如微博,QQ聊天界面中要顯示大量的文字信息,這樣需要計算出文字部分的尺寸,才能設計出合適的控件尺寸和位置。下面是IOS 7.0計算文本尺寸的方法。
- (CGRect)boundingRectWithSize:(CGSize)size
options:(NSStringDrawingOptions)options
attributes:(NSDictionary *)attributes
context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(7_0);
這是NSString的對象方法,一個字符串實例調用該方法時,方法會通過傳入的參數返回一個CGRect型數據,這個數據的size就是此時字符串顯示成文本的尺寸。
size:
限制尺寸,用于計算文本繪制時占據的矩形塊,例如微博開發中size.w
不超過scence.w
。可以將size.y
設置為無限大MAXFLOAT
以便于顯示所有文字內容。
option:
文本繪制時的附加選項。
有四種類型:
1.NSStringDrawingTruncatesLastVisibleLine
2.NSStringDrawingUsesLineFragmentOrigin
3.NSStringDrawingUsesFontLeading
4.NSStringDrawingUsesDeviceMetrics
通常使用NSStringDrawingUsesLineFragmentOrigin
,如果options
參數為NSStringDrawingUsesLineFragmentOrigin
,那么整個文本將以每行組成的矩形為單位計算整個文本的尺寸。
attributes:
將文本UIFront
存入字典傳到這里。例如,
NSDictionary *dict = @{NSFontAttributeName : font}
context
context
上下文。包括一些信息,例如如何調整字間距以及縮放。最終,該對象包含的信息將用于文本繪制。該參數可為 nil 。
NSStringDrawingOptions四種類型解釋
如果options
參數為NSStringDrawingUsesLineFragmentOrigin
,那么整個文本將以每行組成的矩形為單位計算整個文本的尺寸。
(在這里有點奇怪,因為字體高度大概是13.8,textView中大概有10行文字,此時用該選項計算出來的只有5行,即高度為69。
而同時使用
NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin
卻可以得出文字剛好有10行,即高度為138,這里要等iOS7官方的文檔出來再看看選項的說明,因為畢竟以上文檔是iOS6的東西)
如果為
NSStringDrawingTruncatesLastVisibleLine
或者NSStringDrawingUsesDeviceMetric
,那么計算文本尺寸時將以每個字或字形為單位來計算。
如果為
NSStringDrawingUsesFontLeading
則以字體間的行距(leading,行距:從一行文字的底部到另一行文字底部的間距。)來計算。
各個參數是可以組合使用的,如NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine
。
根據該方法調整一下Reader的分頁方法:(主要是將被iOS7 Deprecated的sizeWithFont:constrainedToSize:lineBreakMode:
方法改成了boudingRectWithSize:options:attributes:context:
方法來計算文本尺寸)
延伸
iOS7 中 boundingRectWithSize:options:attributes:context:計算文本尺寸的使用
之前使用了NSString類的sizeWithFont:constrainedToSize:lineBreakMode:
方法,但是該方法已經被iOS7 Deprecated了,而iOS7新出了一個boudingRectWithSize:options:attributes:context
方法來代替。
而具體怎么使用呢,尤其那個attribute
NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:13]};
CGSize size = [@“相關NSString” boundingRectWithSize:CGSizeMake(100, 0)
options: NSStringDrawingTruncatesLastVisibleLine |
NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading
attributes:attribute context:nil].size;