iOS 7上不推荐使用sizeWithFont后如何替换它
我有一个老项目,代码使用sizeWithFont。我收到xcode的警告,说它在iOS 7中第一次被弃用,并要求我将其替换为iOS 7上不推荐使用sizeWithFont后如何替换它,ios,uilabel,Ios,Uilabel,我有一个老项目,代码使用sizeWithFont。我收到xcode的警告,说它在iOS 7中第一次被弃用,并要求我将其替换为 (CGRect)boundingRectWithSize:(CGSize)大小选项:(NSStringDrawingOptions)选项属性:(NSDictionary*)属性上下文:(NSStringDrawingContext*)上下文 我有两个问题: 如果我不打算改变它,会发生什么?它会使我的应用程序崩溃,还是绕过不推荐的API 二,。我想使用建议的API,但我很困
(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
)的大小,则此方法仅提供文本占用的空间,而不是视图占用的空间,对于多行,这可能导致剪切文本,因为InstantUITextView
包含一些填充,这些方法没有考虑到这一点。
添加文本后,在文本视图上调用-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