UIFont & 测量NSString大小

升级Xcode7之后,报了很多低版本的警告,关于UILabel的text最多
1, sizeWithFont弃用了:
   - ( CGSize )sizeWithFont:( UIFont  *)font  NS_DEPRECATED_IOS ( 2 _0,  7 _0,  "Use -sizeWithAttributes:" );
现在的用法:
     CGSize  textSize = [ _loadingText   sizeWithAttributes : @{ NSFontAttributeName  : [ _label   font ] } ];


2, - ( CGSize )sizeWithFont:( UIFont  *)font constrainedToSize:( CGSize )size lineBreakMode:弃用了
现在的用法:
#if  0
  NSString *  title;
  CGSize contentSize = [title sizeWithFont:[UIFont systemFontOfSize: 14.0 ] constrainedToSize:CGSizeMake(contentLabelWidth, MAXFLOAT) lineBreakMode:NSLineBreakByCharWrapping];
#else
   CGSize  contentSize = [ title  boundingRectWithSize : CGSizeMake (contentLabelWidth,  MAXFLOAT )
                                             
options : NSStringDrawingUsesLineFragmentOrigin  |
                                                     
NSStringDrawingTruncatesLastVisibleLine  |
                                                     
NSStringDrawingUsesFontLeading
                                          
attributes : @{ NSFontAttributeName  : [ UIFont   systemFontOfSize : 14.0 ] }
                                             
context : nil ]. size ;
#endif


// 下面来详细分析一下这个方法 
// 首先这个方法是NSString的方法
- ( CGRect )boundingRectWithSize:( CGSize )size options:( NSStringDrawingOptions )options attributes:( nullable   NSDictionary < NSString  *,  id > *)attributes context:( nullable   NSStringDrawingContext  *)context  NS_AVAILABLE ( 10 _11,  7 _0);

参数:(以下是官方文档的翻译)
size :
宽高限制,用于计算文本绘制时占据的矩形块
一般是指定宽度,然后此方法会根据字串的长度计算出高度,当然也可以自己指定高度。
当自己指定高度后,若 指定的高度 <  计算出得字串的高度(显示不全),取指定的高度,否则取计算出来的高度.
所以为了取计算出来的合适高度,高限制一般指定为 MAXFLOAT. 

options:
重点就是这个:
typedef   NS_OPTIONS (NSInteger, NSStringDrawingOptions) {
    NSStringDrawingUsesLineFragmentOrigin = 
1  <<  0 // The specified origin is the line fragment origin, not the base line origin
    NSStringDrawingUsesFontLeading = 
1  <<  1 // Uses the font leading for calculating line heights
    NSStringDrawingUsesDeviceMetrics = 
1  <<  3 // Uses image glyph bounds instead of typographic bounds
    NSStringDrawingTruncatesLastVisibleLine 
NS_ENUM_AVAILABLE ( 10 _5,  6 _0) =  1  <<  5 // 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
NS_ENUM_AVAILABLE ( 10 _0,  6 _0);

NSStringDrawingUsesLineFragmentOrigin
用于多行绘制,因为默认是单行绘制(使用基线),如果不指定,那么绘制出的高度就是0.也即是啥都不显示出来。
而且方法的前面也说了:
// NOTE: All of the following methods will default to drawing on a baseline, limiting drawing to a single line.
// To correctly draw and size multi-line text, pass NSStringDrawingUsesLineFragmentOrigin in the options parameter.
译:如果要正确的画多行的文本,通过指定 NSStringDrawingUsesLineFragmentOrigin作为options的参数。

NSStringDrawingUsesFontLeading :
计算行高时使用字体的间距,也就是行高= 行距+字体高度

NSStringDrawingTruncatesLastVisibleLine
设置的string的bounds放不下文本的话,就会截断,然后在最后一个可见行后面加上省略号。如果NSStringDrawingUsesLineFragmentOrigin不设置的话,只设置这一个选项是会被忽略的。因为如果不设置NSStringDrawingUsesLineFragmentOrigin这个选项,默认是单行显示的。
(注意:
我在弹出框的内容string中设置了这个字串,但是最后显示出来的时候并没有打省略号…,这是因为
在当前方法 boundingRectWithSize.. 中设置这个option并不会起作用的,因为当前方法只是测量string的大小,并不是绘制string,在 drawWithRect:( CGRect )rect options:( NSStringDrawingOptions )options attributes:...这个方法中设置这个option就会起作用 )

NSStringDrawingUsesDeviceMetrics
计算布局时使用图元字形(而不是印刷字体)

经过调试测试,使用options之后,结果跟之前是一样的,所以使用起来没有问题。

使用时的注意事项:

1: NSAttributedString 的每个部分都要至少设置两个属性: 

NSFontAttributeName

NSForegroundColorAttributeName

 

2: NSStringDrawingOptions 的值, 在多行的情况下, 至少要有   

NSStringDrawingUsesLineFragmentOrigin   // 如果不指定,高度为0

NSStringDrawingUsesFontLeading




参考: http://blog.csdn.net/kmyhy/article/details/8895643 这里面有跟多全面的翻译






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值