首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >sizeWithFont方法已弃用。boundingRectWithSize返回意外的值

sizeWithFont方法已弃用。boundingRectWithSize返回意外的值
EN

Stack Overflow用户
提问于 2013-10-16 16:35:59
回答 5查看 66.7K关注 0票数 82

在iOS7中,不推荐使用sizeWithFont,所以我使用boundingRectWithSize(它返回一个CGRect值)。我的代码:

代码语言:javascript
复制
 UIFont *fontText = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16];
                    // you can use your font.

 CGSize maximumLabelSize = CGSizeMake(310, 9999);

 CGRect textRect = [myString boundingRectWithSize:maximumLabelSize   
                             options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{NSFontAttributeName:fontText}
                             context:nil];

 expectedLabelSize = CGSizeMake(textRect.size.width, textRect.size.height);

textRect中,我得到的大小比我的maximumLabelSize大,与使用sizeWithFont时的大小不同。如何解决此问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-10-22 20:54:16

如何创建新标签并使用sizeThatFit:(CGSize)size ??

代码语言:javascript
复制
UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"YOUR FONT's NAME" size:16];
gettingSizeLabel.text = @"YOUR LABEL's TEXT";
gettingSizeLabel.numberOfLines = 0;
gettingSizeLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);

CGSize expectSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

编辑:此上层代码不适合ios 7及以上版本,请使用以下代码:

代码语言:javascript
复制
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize   
                         options:NSStringDrawingUsesLineFragmentOrigin| NSStringDrawingUsesFontLeading
                         attributes:@{NSFontAttributeName:fontText}
                         context:nil];
票数 152
EN

Stack Overflow用户

发布于 2013-10-21 17:15:53

也许您需要为this答案中建议的方法提供额外的选项:

代码语言:javascript
复制
CGSize maximumLabelSize = CGSizeMake(310, CGFLOAT_MAX);
CGRect textRect = [myString boundingRectWithSize:maximumLabelSize   
                                         options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                      attributes:@{NSFontAttributeName: fontText}
                                         context:nil];
票数 37
EN

Stack Overflow用户

发布于 2014-07-08 00:12:29

以下是我的工作代码片段:

代码语言:javascript
复制
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:attributeDict];

NSString *headline  = [dict objectForKey:@"title"];  
UIFont *font        = [UIFont boldSystemFontOfSize:18];  
CGRect  rect        = [headline boundingRectWithSize:CGSizeMake(300, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];

CGFloat height      = roundf(rect.size.height +4)

我在计算的高度中添加了4px,因为如果没有这些4px,就会少了一行。

我在tableView中使用了这段代码,并将" height“添加到NSNumbers数组中,这样就得到了默认textLabel的正确单元格高度。

如果你想要在textLabel中的文本下有更多的空间,增加4个像素。

*更新*

我不同意“40px的宽度错误”,我应该是缺少高度的4px,因为4px是字母和单行边界之间的空格的默认高度。你可以用UILabel检查它,如果字体大小为16,你需要UILabel高度为20。

但是如果你的最后一行没有"g“或者其他任何东西,那么测量结果可能会错过高度的4px。

我用一个小方法重新检查了一下,我得到了我的标签的准确高度为20,40或60,正确的宽度小于300px。

要支持iOS6和iOS7,您可以使用my方法:

代码语言:javascript
复制
- (CGFloat)heightFromString:(NSString*)text withFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
    CGRect rect;

    float iosVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (iosVersion >= 7.0) {
        rect = [text boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
    }
    else {
        CGSize size = [text sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
        rect = CGRectMake(0, 0, size.width, size.height);
    }
    NSLog(@"%@: W: %.f, H: %.f", self, rect.size.width, rect.size.height);
    return rect.size.height;
}

*升级*

感谢你的评论,我升级了我的函数如下。由于sizeWithFont已被弃用,并且您将在XCode中收到警告,因此我添加了诊断杂注代码来删除此特定函数的警告-调用/代码块。

代码语言:javascript
复制
- (CGFloat)heightFromStringWithFont:(UIFont*)font constraintToWidth:(CGFloat)width
{
    CGRect rect;

    if ([self respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]) {
        rect = [self boundingRectWithSize:CGSizeMake(width, 1000) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:font} context:nil];
    }
    else {
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
        CGSize size = [self sizeWithFont:font constrainedToSize:CGSizeMake(width, 1000) lineBreakMode:NSLineBreakByWordWrapping];
        rect = CGRectMake(0, 0, size.width, size.height);
#pragma GCC diagnostic pop
    }
    return ceil(rect.size.height);
}

除了4px主题:根据您使用的字体和字体粗细,计算返回不同的高度值。在我的例子中: HelveticaNeue-Medium的fontsize为16.0,返回的行高为20.0,但是对于两行返回39.0,对于4行返回78px --从第2行开始,每行都缺少1px --但是你想让你的fontsize + 4px的每一行都有一个高度结果。

请在编码时牢记这一点!

我还没有一个函数来解决这个“问题”,但我会在完成后更新这篇文章。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19398674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档