[英]how to replace sizeWithFont after it is deprecated on iOS 7
我有一个旧项目,并且代码正在使用sizeWithFont。 我从xcode收到警告,说它在iOS 7中已被弃用,并要求我将其替换为
(CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context
我有两个问题:
I.如果我不打算更改它,那又会怎样? 它会崩溃我的应用程序,还是只是绕过已弃用的API?
二。 我想使用建议的API,但感到困惑的是它要求CGSize参数并返回CGRect,而我的旧项目只需要返回CGSize。 如果我已经有了CGSize,为什么还要再次使用rect? 请更正我,并使用新的API给出代码。 非常感谢!
编辑:
我已经检查了iOS 7中过时的sizeWithFont:替换中的答案吗?
我将做一个自我回答,比较两个解决方案。
我有另一个问题:
我注意到有一个[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
我将做一个自我回答,以比较iOS 7中过时的sizeWithFont中来自Replacement的两个解决方案:
顺便说一句,我不确定是否需要setNumberOfLines,所以我将其设置为无限制
[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相同。 总结一下,我使用sizeWithAttributes,因为它更简单。
但是要提到的一件事是:
iOS 7中过时的sizeWithFont替换中的答案: 使用(CGSize){width, CGFLOAT_MAX}];
作为大小参数,
但是我测试了是否使用了(CGSize){self.bounds.size.width, CGFLOAT_MAX}];
结果不正确,计算出的宽度小于其他解决方案。
如果使用(CGSize){CGFLOAT_MAX, CGFLOAT_MAX}
,我将得到与其他答案相同的结果。 在决定选择解决方案之前,请测试您的代码。
如果您的标签需要根据文本大小更改宽度,则可以提供CGFLOAT_MAX的宽度,而如果您希望根据标签中的文本高度更改,则可以提供CGFLOAT_MAX的高度。 另一个参数将是静态的。
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
,则此方法仅为您提供文本所占据的空间,而不是视图所占据的空间,并且可以多行导致剪切的文本,例如, UITextView
包含一些填充,这些方法没有考虑到这一点。
在添加文本后,在文本视图上调用-sizeToFit
可以提供实际大小。
关于您的问题:
.size
里面CGRect
结构。 UILabel
将使用-linebreakMode
选择的规则剪切文本,使用0表示没有限制
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.