替换为不推荐的sizeWithFont:在iOS 7中?
在iOS 7中, sizeWithFont:
现在已被弃用。 现在如何将UIFont对象传递给替换方法sizeWithAttributes:
:?
使用sizeWithAttributes:
相反,它现在需要一个NSDictionary
。 用键UITextAttributeFont
和你的字体对象UITextAttributeFont
,如下所示:
CGSize size = [string sizeWithAttributes:
@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];
// Values are fractional -- you should take the ceilf to get equivalent values
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
我相信该函数已被弃用,因为该系列的NSString+UIKit
函数( sizewithFont:...
等)基于UIStringDrawing
库,它不是线程安全的。 如果你试图在主线程上运行它们(就像任何其他UIKit
功能一样),你会得到不可预知的行为。 特别是,如果您同时在多个线程上运行该功能,它可能会导致应用程序崩溃。 这就是为什么在iOS 6中,他们为NSAttributedString
引入了boundingRectWithSize:...
方法。 这是建立在NSStringDrawing
库之上的,并且是线程安全的。
如果您查看新的NSString
boundingRectWithSize:...
函数,它将以与NSAttributeString
相同的方式请求一个attributes数组。 如果我不得不猜测,iOS 7中的这个新的NSString
函数仅仅是iOS 6的NSAttributeString
函数的一个包装。
在那个笔记上,如果你只支持iOS 6和iOS 7,那么我肯定会将你的所有NSString
sizeWithFont:...
更改为NSAttributeString
boundingRectWithSize
。 如果你碰巧有一个奇怪的多线程案例,它会为你节省很多头痛! 以下是我如何转换NSString
sizeWithFont:constrainedToSize:
::
曾经是:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font
constrainedToSize:(CGSize){width, CGFLOAT_MAX}];
可以替换为:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
[[NSAttributedString alloc] initWithString:text
attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;
请注意文档中提到:
在iOS 7及更高版本中,此方法返回小数大小(在返回的CGRect
的大小组件中); 要使用返回的大小来调整视图大小,您必须使用ceil函数将其值提高到最接近的较大整数。
因此,要计算用于调整视图大小的高度或宽度,我将使用:
CGFloat height = ceilf(size.height);
CGFloat width = ceilf(size.width);
正如你可以在苹果开发者网站上看到sizeWithFont
,它已被弃用,所以我们需要使用sizeWithAttributes
。
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
NSString *text = @"Hello iOS 7.0";
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
// code here for iOS 5.0,6.0 and so on
CGSize fontSize = [text sizeWithFont:[UIFont fontWithName:@"Helvetica"
size:12]];
} else {
// code here for iOS 7.0
CGSize fontSize = [text sizeWithAttributes:
@{NSFontAttributeName:
[UIFont fontWithName:@"Helvetica" size:12]}];
}
链接地址: http://www.djcxy.com/p/28199.html