替换为不推荐的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

上一篇: Replacement for deprecated sizeWithFont: in iOS 7?

下一篇: Sizing a UILabel to fit?