2014-10-20 86 views
0

我已经完成了iOS/Objective-C训练10天(并且几乎没有其他编码类),并因此脱离了我的联盟。我在工作中继承了一个巨大的iOS应用程序,现在我负责从iOS6中心升级到iOS7中心。我试图清理Xcode中的所有警告,并且根本找不到这个警告。我已经搜索了几天,阅读了所有关于这个问题的答案,但没有一个能够完全回答我的问题(尽管有些帮助我接近了,对此我非常感激)。正确的语法替换弃用的“sizeWithFont:constrainedToSize:lineBreakMode”

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

我所做的研究产生了一些如何使用新方法的例子,但它似乎以不同的方式使用(CGRect和CGSize),而Apple的文档只是给我发送“一个无限循环”。对于我的“选项:”,Apple表示使用段落样式选项,但这些选项与已弃用样式可用的选项完全不同(其中一半已弃用)。例如,他们说如果你不指定样式,它将使用默认的段落样式,但我不知道这些属性是什么属性,或者真的在哪里找到它们来验证它们是什么。如果我要指定一种风格,它必须是“这一个”或“那一个”,但是如果我使用其中的一个,我还必须使用“这个另一个”,但是这些都不会生效,除非我的线条休息模式是“又一个”,但“另一种”风格并不是我需要使用的那种。

因此,我无法弄清楚如何将旧代码中的属性专门转换为代码,以便在非弃用方法中产生完全相同的结果。我认为我非常接近,但无法正确使用“NSLineBreakByClipping”来转换为新方法的语法而不会发生硬错误。该错误位于“width = expectedLabelSize1.width”行中,并且在“struct CGRect”中显示“没有名为”width“的成员。如果我更改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属性?

谢谢!

编辑:我很抱歉,但我只是意识到,我遗漏了一些代码,可能有助于解释我得到的错误之一。我忽略了上面的前两行,其中变量“width”被初始化为一个整数。这整个“标签尺寸计算”代码是一个更大的“if”声明的一部分,但唯一给予我适合的部分是本文所属的不赞成使用的方法。无论如何,因为“宽度”没有在CGRect中解决,CGRect方法(width = expectedLabelSize1.width)后面的下一行生成的错误高于大约“宽度”不是该结构的成员。我明白了,但我不知道如何将“width”属性添加到CGRect结构中。整体方法(boundingRectWithSize:options:attributes:context :)因为我看起来是“干净的”,因为它本身不会产生任何错误,但它不会解决“宽度”或NSLineBreakModeByClipping问题。这就是我得到一个错误的地方(对于缺少的“宽度”变量)以及我正在迷失的地方,究竟如何将NSLineBreakModeByClipping合并到新的方法语法中。

回答

0

使用UILabel尺寸更简单使用

例如,

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

+0

如果你喜欢'layoutSubviews'的方法是这样的伟大工程。如果你在类/静态方法中,那么使用'boundingRectWithSize:options:attributes:context:'是最简洁的。 – AdamPro13 2014-10-20 22:10:47

+0

谢谢,railparade,但使用这种方法在这种情况下不起作用。代码中的“surveyName”对象是一个NSString对象。我得到一个错误,“NSString没有可见的@interface声明选择器sizeThatFits:”。从我可以挖掘,这意味着该方法不是NSString类的一部分,因此不能使用。此代码生成的“标签”是PDF封面页上的文本标签,而不是UI上的按钮。这有帮助吗? – iOSOverload 2014-10-28 19:41:24

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)}) 
} 

您还需要在文本属性字典来传递。对于要在两个(字体和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];