为了账号安全,请及时绑定邮箱和手机立即绑定

取代过时的尺寸字体:在iOS 7中?

取代过时的尺寸字体:在iOS 7中?

POPMUISE 2019-07-01 16:07:03
取代过时的尺寸字体:在iOS 7中?在IOS 7中,sizeWithFont:现在不受欢迎了。现在如何将UIFont对象传递到替换方法中?sizeWithAttributes:?
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

我认为这个功能被废弃是因为NSString+UIKit职能(sizewithFont:...等)是基于UIStringDrawing库不是线程安全的。如果您试图在主线程上运行它们(与任何其他线程一样)UIKit(功能),您将得到不可预测的行为。特别是,如果您同时在多个线程上运行该函数,它可能会使您的应用程序崩溃。这就是为什么在iOS 6中,他们引入了一个boundingRectWithSize:...方法NSAttributedString..这是建在NSStringDrawing库,并且是线程安全的。

如果你看看新的NSString boundingRectWithSize:...函数中,它请求属性数组的方式与NSAttributeString..如果我不得不猜的话,这个新的NSString函数在IOS 7中只是一个包装器。NSAttributeString功能来自iOS 6。

在这一点上,如果您只支持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);


查看完整回答
反对 回复 2019-07-01
?
慕容3067478

TA贡献1773条经验 获得超3个赞

如你所见sizeWithFont在Apple Developer站点上,它被废弃了,所以我们需要使用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]}];}


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 588 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信