更正已弃用的“sizeWithFont:constrainedToSize:lineBreakMode”的正确语法

时间:2014-10-20 20:18:34

标签: ios objective-c xcode deprecated

我已经进行了10天的iOS / Objective-C培训(而且几乎没有其他编码课程),因此我在这方面脱离了我的联盟,但我继承了一个巨大的iOS应用程序,我现在正在工作负责从iOS6中心升级到iOS 7中心。我试图清理Xcode中的所有警告,根本无法解决这个问题。我已经搜索了几天并且在这里阅读了每一个答案,但是没有一个完全回答我的问题(尽管有些人帮助我靠近了,我真的很感激)。

我知道" sizeWithFont:constrainedToSize:lineBreakMode:"已弃用,需要替换为" boundingRectWithSize:options:attributes:context:",但对于我的生活,我无法弄清楚如何将一些现有代码从旧方法转换为新的。如果我能理解这一点,它将在Xcode中清除35个其他警告,因为在许多其他地方使用了相同的弃用方法。

我所做的研究产生了一些如何使用新方法的例子,但似乎它以不同的方式使用(CGRect和CGSize),而Apple的文档只是让我进入&# 34;一个无限循环"。对于我的"选项:",Apple说要使用段落样式选项,但这些选项与已弃用的样式完全不同(其中一半也被弃用)。例如,他们说如果你没有指定一个样式,它将使用默认的段落样式,但我不知道那些属性或真正在哪里找到它们以验证它们是什么。如果我指定一种风格,它必须是"这一个"或者"那个",但是如果我使用其中一个我也必须使用"另一个",但是除非我的换行模式是&#34,否则这些都不会生效34;又是另一个",但是另一个"又是另一个"风格不是我需要使用的风格。

因此,我无法弄清楚如何将旧代码中的属性专门转换为代码,这些代码将在非弃用方法中产生完全相同的结果。我认为我非常接近,但无法正确使用" NSLineBreakByClipping"转换为新方法的语法而不会出现硬错误。错误出现在" width = expectedLabelSize1.width"并说"没有名为"宽度"在' struct CGRect' &#34 ;.如果我更改CGRect所以CGSize,就像在原始代码中那样,我在该特定行上得到一个关于初始化具有不兼容类型的表达式的不同错误。

以下是原始代码:

        int width = 0;
    if([surveyType isEqualToString:@"Site Survey"]){

//calculate the expected width of the survey label...
        CGSize maximumLabelSize = CGSizeMake(165,16);
        CGSize expectedLabelSize1 = [surveyName sizeWithFont:[UIFont systemFontOfSize:9.0] constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByClipping];
        width=expectedLabelSize1.width;
        if(width > 165){
            width=165;
        }

以下是我能够拼凑起来的东西:

//calculate the expected width of the survey label...
        CGSize maximumLabelSize = CGSizeMake(165,16);
        CGRect expectedLabelSize1 = [surveyName boundingRectWithSize:maximumLabelSize
                                                  options:(NSStringDrawingUsesLineFragmentOrigin |
                                                           NSStringDrawingTruncatesLastVisibleLine | NSLineBreakByWordWrapping)
                                               attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:9.0]}
                                                  context:nil];

        width=expectedLabelSize1.width;
        if(width > 165){
            width=165;
        }

我显然不知道我在这里做了什么,所以我希望有人可以告诉我如何将旧方法转换为新方法而不会丢失任何功能或在此过程中格式化。如果不再显示可用属性或选项,如何合并我最初拥有的NSLineBreakModeByClipping属性?

谢谢!!!

编辑:我道歉,但我刚刚意识到我遗漏了一些代码,可能有助于解释我遇到的一个错误。我遗漏了上面的前两行,其中变量&#34; width&#34;初始化为整数。整个&#34;标签尺寸计算&#34;代码是更大的代码的一部分&#34; if&#34;声明,但唯一让我适合的部分是这篇文章所关注的弃用方法。无论如何,因为&#34;宽度&#34;在CGRect中没有解决,CGRect方法之后的下一行(width = expectedLabelSize1.width)生成大约&#34; width&#34;不是结构的成员。我现在知道了,但我不知道如何添加&#34;宽度&#34;属性为CGRect结构。我所拥有的整体方法(boundingRectWithSize:options:attributes:context :)似乎是&#34; clean&#34;,因为它本身不会产生任何错误,但它并没有。地址&#34;宽度&#34;或NSLineBreakModeByClipping。这就是我收到错误的地方(对于缺失的&#34;宽度&#34;变量)以及我在如何将NSLineBreakModeByClipping合并到新方法语法方面的迷失。< / p>

2 个答案:

答案 0 :(得分:0)

使用UILabel sizeThatFits

更简单

例如

CGSize maximumLabelSize = CGSizeMake(CGFLOAT_MAX,16);
CGSize expectedLabelSize1 = [surveyName sizeThatFits:max];
width=expectedLabelSize1.width;
if(width > 165){
  width=165;
}

另见http://doing-it-wrong.mikeweller.com/2012/07/youre-doing-it-wrong-2-sizing-labels.html

答案 1 :(得分:0)

以下是我这些日子的文字大小调整方法:

- (CGSize)textSizeWithBoundingWidth:(CGFloat)boundingWidth attributes:(NSDictionary *)attributes
{
    CGSize boundingSize = (CGSize){.width = boundingWidth,.height = 0};
    NSStringDrawingOptions options = (NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine);
    CGRect textBoundingRect = [self boundingRectWithSize:boundingSize options:options attributes:attributes context:nil];

    return ((CGSize){.width = CGRectGetMaxX(rect),.height = CGRectGetMaxY(rect)})
}

您还需要传入文本属性字典。对于你想要的两个(font和lineBreakMode),你可以像这样传递它们:

NSMutableDictionary* attributesDictionary = [NSMutableDictionary dictionary];

[attributesDictionary setObject:self.font forKey:NSFontAttributeName];

NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[style setLineBreakMode:self.lineBreakMode];

[attributesDictionary setObject:style forKey:NSParagraphStyleAttributeName];