升级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];
#elseCGSize contentSize = [title sizeWithFont:[UIFont systemFontOfSize: 14.0 ] constrainedToSize:CGSizeMake(contentLabelWidth, MAXFLOAT) lineBreakMode:NSLineBreakByCharWrapping];
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 = 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.
// 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 这里面有跟多全面的翻译