Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS 7上不推荐使用sizeWithFont后如何替换它_Ios_Uilabel - Fatal编程技术网

iOS 7上不推荐使用sizeWithFont后如何替换它

iOS 7上不推荐使用sizeWithFont后如何替换它,ios,uilabel,Ios,Uilabel,我有一个老项目,代码使用sizeWithFont。我收到xcode的警告,说它在iOS 7中第一次被弃用,并要求我将其替换为 (CGRect)boundingRectWithSize:(CGSize)大小选项:(NSStringDrawingOptions)选项属性:(NSDictionary*)属性上下文:(NSStringDrawingContext*)上下文 我有两个问题: 如果我不打算改变它,会发生什么?它会使我的应用程序崩溃,还是绕过不推荐的API 二,。我想使用建议的API,但我很困

我有一个老项目,代码使用sizeWithFont。我收到xcode的警告,说它在iOS 7中第一次被弃用,并要求我将其替换为

(CGRect)boundingRectWithSize:(CGSize)大小选项:(NSStringDrawingOptions)选项属性:(NSDictionary*)属性上下文:(NSStringDrawingContext*)上下文

我有两个问题:

如果我不打算改变它,会发生什么?它会使我的应用程序崩溃,还是绕过不推荐的API

二,。我想使用建议的API,但我很困惑,它要求一个CGSize参数并返回一个CGRect,而我的旧项目只需要返回一个CGSize。如果我已经得到了CGSize,为什么我还需要rect?请纠正我并给出使用新API的代码。非常感谢

编辑:

我已经核对了答案


我将做一个自我回答来比较两种解决方案

我的另一个问题是:

我注意到有一个
[self-setNumberOfLines:1],我应该保留它还是可以删除它?目前它对我的代码没有任何影响,但我不知道其他情况,也就是“多行”情景

旧的遗留代码:

@implementation UILabel (dynamicSize)
-(CGFloat)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(9999,self.frame.size.height);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font]
                                       constrainedToSize:maximumLabelSize
                                           lineBreakMode:[self lineBreakMode]];
    return expectedLabelSize.width;
}
@end

我将做一个自我回答,比较两种解决方案

顺便说一句,我不确定我是否需要设置NumberOfLines,所以我会将其设置为无限制

[self setNumberOfLines:0];
一个解决办法是

CGSize size = [[self text] sizeWithAttributes:@{NSFontAttributeName: [self font]}];

// Values are fractional -- you should take the ceilf to get equivalent values
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
另一个:

NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:[self text]
                                                                     attributes:@{NSFontAttributeName: [self font]}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){CGFLOAT_MAX, CGFLOAT_MAX} // be careful here
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];
CGSize size = rect.size;
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
这两种解决方案给出的结果与不推荐使用的API相同。总结一下,我使用SizeWithatAttributes,因为它更简单

然而,有一件事需要提及:

中的答案使用了各种
(CGSize){width,CGFLOAT_MAX}]
作为大小参数

但是我测试了是否像
(CGSize){self.bounds.size.width,CGFLOAT_MAX}那样使用它
结果不正确,计算的宽度小于其他解决方案


如果我使用
(CGSize){CGFLOAT\u MAX,CGFLOAT\u MAX}
,我将得到与另一个答案相同的结果。在决定选择解决方案之前,请先测试代码。

如果标签需要根据文本大小更改宽度,则可以提供CGFLOAT_最大宽度;如果需要根据标签中的文本更改高度,则可以将CGFLOAT_最大高度设置为高度。另一个参数将是静态的

NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:[self text]

//If Height is dynamic and width is fix, Eg.150 width fix, and height dynamic
CGRect rect = [attributedText boundingRectWithSize:(CGSize){150, CGFLOAT_MAX}
                                       options:NSStringDrawingUsesLineFragmentOrigin
                                       context:nil];

              // OR

//If width is dynamic and Height is  fix, Eg.150 Height fix, and width dynamic
CGRect rect = [attributedText boundingRectWithSize:(CGSize){CGFLOAT_MAX,150}
                                       options:NSStringDrawingUsesLineFragmentOrigin
                                       context:nil];

您将根据所需的标签大小获得动态宽度和高度。

这两种方法没有概念,如果您试图获得文本容器(如
UITexView
UILabel
)的大小,则此方法仅提供文本占用的空间,而不是视图占用的空间,对于多行,这可能导致剪切文本,因为Instant
UITextView
包含一些填充,这些方法没有考虑到这一点。
添加文本后,在文本视图上调用
-sizeToFit
,可以得到真实的大小。
关于你的问题:

  • 弃用意味着可能会在未来的iOS版本中崩溃,通常暂时保留它们不是什么大问题,但我强烈建议更改它们,更新代码,请注意,如果您部署的iOS目标不包括新的API,您的应用程序将在特定的iOS版本中崩溃
  • 只需在
    CGRect
    结构中使用
    .size
  • 这是可能的最大行数,如果它不适合
    UILabel
    将使用在
    -linebreakMode
    中选择的规则剪切文本,使用0无限制

  • 对于你的第一个问题,在苹果删除旧代码之前,你的应用不会崩溃。在不久的将来不会轻易发生的事情。有关
    sizeWithFont:constrainedToSize:
    的使用,请参阅重复的问题。谢谢,我正在查看it@rckoenes我用我挖掘出来的东西更新了我的问题。我想把它作为一个答案发布,但你关闭了它。我们能做些什么来突出我的发现吗?@wingzeor我已经重新打开了你的问题。@rckoenes谢谢,更新了。顺便说一句,我注意到有
    [self-setNumberOfLines:1]我应该保留它吗?我可以删除它?我很感激你的回答,但与我的回答相比,你在如何选择尺寸方面缺乏一些精确性和解释。我已经自我回答了,所以我希望你能仔细阅读答案。我感谢你的回答,但我已经发布了所有的解决方案和比较。对于你的答案#2,一个
    self.bounds.size
    是不够的。如果使用的是
    boundingRectWithSize
    ,则它应该是一个{CGFLOAT\u MAX,CGFLOAT\u MAX}。最后我选择了
    sizeWithAttributes