【问题标题】:Replacement for deprecated -sizeWithFont:constrainedToSize:lineBreakMode: in iOS 7?替换已弃用的 -sizeWithFont:constrainedToSize:lineBreakMode: 在 iOS 7 中?
【发布时间】:2013-09-25 01:07:38
【问题描述】:

在iOS 7中,方法:

- (CGSize)sizeWithFont:(UIFont *)font
     constrainedToSize:(CGSize)size
         lineBreakMode:(NSLineBreakMode)lineBreakMode 

以及方法:

- (CGSize)sizeWithFont:(UIFont *)font

已弃用。我该如何替换

CGSize size = [string sizeWithFont:font
                 constrainedToSize:constrainSize
                     lineBreakMode:NSLineBreakByWordWrapping];

和:

CGSize size = [string sizeWithFont:font];

【问题讨论】:

  • 替代方法是-sizeWithAttributes:
  • okholex 谢谢,但是,我怎样才能使用像 NSDIctionary 这样的标签字体?如果我的代码是这样的: sizeWithFont:customlabel.font ;空问 "sizeWithAttributes:"
  • 这里是如何定义属性的官方文档:developer.apple.com/library/ios/documentation/UIKit/Reference/…

标签: ios iphone ios7 nsstring sizewithfont


【解决方案1】:

你可以试试这个:

CGRect textRect = [text boundingRectWithSize:size
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:FONT}
                                 context:nil];

CGSize size = textRect.size;

只需将“FONT”更改为“[UIFont font....]”

【讨论】:

  • 你在哪里提到 NSLineBreakByWordWrapping?去哪儿了?
  • NSLineBreakByWordWrapping 会在 NSParagraphStyle 内。例如:NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping; 在属性中你需要添加NSParagraphStyleAttributeName: paragraphStyle.copy...
  • @ffried 在我的例子中添加了除 NSLineBreakByWordWrapping 以外的换行符的段落样式导致只计算一行的大小......有什么想法吗?
  • 不要忘记boundingRectWithSize:options:attributes:context: 返回小数值。您需要分别执行ceil(textRect.size.height)ceil(textRect.size.width) 以获得真实的高度/宽度。
  • BOLIVIASize 到底是什么?
【解决方案2】:

由于我们不能对所有高于 4.3 的 iOS 使用 sizeWithAttributes,我们必须为 7.0 和之前的 iOS 编写条件代码。

1) 解决方案1:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
   CGSize size = CGSizeMake(230,9999);
   CGRect textRect = [specialityObj.name  
       boundingRectWithSize:size
                    options:NSStringDrawingUsesLineFragmentOrigin
                 attributes:@{NSFontAttributeName:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14]}
                    context:nil];
   total_height = total_height + textRect.size.height;   
}
else {
   CGSize maximumLabelSize = CGSizeMake(230,9999); 
   expectedLabelSize = [specialityObj.name sizeWithFont:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; //iOS 6 and previous. 
   total_height = total_height + expectedLabelSize.height;
}

2) 解决方案 2

UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16]; // Your Font-style whatever you want to use.
gettingSizeLabel.text = @"YOUR TEXT HERE";
gettingSizeLabel.numberOfLines = 0;
CGSize maximumLabelSize = CGSizeMake(310, 9999); // this width will be as per your requirement

CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

第一个解决方案是有时无法返回正确的高度值。所以使用另一种解决方案。这将完美地工作。

第二个选项非常好,并且在没有条件代码的所有 iOS 中都能顺利运行。

【讨论】:

  • 为什么是 230、999?你从哪里得到的号码>
  • 230 可以是任意数字。它代表您想要的标签宽度。我宁愿用 INFINITY 或 MAXFLOAT 替换 9999。
  • 第二个解决方案就像一个魅力。谢谢尼拉夫。
  • "[AppHandlers zHandler]" 给出错误..“未声明的标识符”。如何解决?
【解决方案3】:

这是一个简单的解决方案:

要求:

CGSize maximumSize = CGSizeMake(widthHere, MAXFLOAT);
UIFont *font = [UIFont systemFontOfSize:sizeHere];

现在 constrainedToSizeusage:lineBreakMode:iOS 7.0 中已弃用:

CGSize expectedSize = [stringHere sizeWithFont:font constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping];

现在在iOS 7.0更大版本中的使用将是:

// Let's make an NSAttributedString first
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:stringHere];
//Add LineBreakMode
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
[paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
[attributedString setAttributes:@{NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, attributedString.length)];
// Add Font
[attributedString setAttributes:@{NSFontAttributeName:font} range:NSMakeRange(0, attributedString.length)];

//Now let's make the Bounding Rect
CGSize expectedSize = [attributedString boundingRectWithSize:maximumSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;

【讨论】:

    【解决方案4】:

    以下是两个简单的方法,它们将替换这两个已弃用的方法。

    以下是相关参考资料:

    如果您使用 NSLineBreakByWordWrapping,则无需指定 NSParagraphStyle,因为这是默认设置: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/index.html#//apple_ref/occ/clm/NSParagraphStyle/defaultParagraphStyle

    您必须获取大小的 ceil,以匹配不推荐使用的方法的结果。 https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes:context:

    + (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font {    
        CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}];
        return CGSizeMake(ceilf(size.width), ceilf(size.height));
    }
    
    + (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{
        CGRect textRect = [text boundingRectWithSize:size
                                         options:NSStringDrawingUsesLineFragmentOrigin
                                      attributes:@{NSFontAttributeName: font}
                                         context:nil];
        return CGSizeMake(ceilf(textRect.size.width), ceilf(textRect.size.height));
    }
    

    【讨论】:

      【解决方案5】:

      在大多数情况下,我使用 sizeWithFont:constrainedToSize:lineBreakMode: 方法来估计 UILabel 的最小尺寸以容纳其文本(尤其是当标签必须是放置在 UITableViewCell 中)...

      ...如果这正是您的情况,您可以简单地使用以下方法:

      CGSize size = [myLabel textRectForBounds:myLabel.frame limitedToNumberOfLines:mylabel.numberOfLines].size;
      

      希望这可能会有所帮助。

      【讨论】:

      • Apple 的文档说你不应该直接调用这个方法。
      • 至少在 iOS 7 SDK 文档中没有提到。
      【解决方案6】:
      UIFont *font = [UIFont boldSystemFontOfSize:16];
      CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil];
      CGSize stringSize= new.size;
      

      【讨论】:

      • 欢迎来到 StackOverFlow。不要再次发布相同的答案。如果您需要在答案中添加内容,请发表评论或对答案进行编辑。
      • 好的..下次我会考虑的。谢谢你的建议。
      【解决方案7】:

      [已接受的答案在一个类别中效果很好。我正在覆盖已弃用的方法名称。这是一个好主意吗?似乎在 Xcode 6.x 中没有任何抱怨]

      如果您的部署目标是 7.0 或更高版本,则此方法有效。类别为NSString (Util)

      NSString+Util.h

      - (CGSize)sizeWithFont:(UIFont *) font;
      - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size;
      

      NSString+Util.m

      - (CGSize)sizeWithFont:(UIFont *) font {
          NSDictionary *fontAsAttributes = @{NSFontAttributeName:font};
          return [self sizeWithAttributes:fontAsAttributes];
      }
      
      - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size {
          NSDictionary *fontAsAttributes = @{NSFontAttributeName:font};
          CGRect retVal = [self boundingRectWithSize:size
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                        attributes:fontAsAttributes context:nil];
          return retVal.size;
      }
      

      【讨论】:

        【解决方案8】:
        UIFont *font = [UIFont fontWithName:@"Courier" size:16.0f];
        
        NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
        paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
        paragraphStyle.alignment = NSTextAlignmentRight;
        
        NSDictionary *attributes = @{ NSFontAttributeName: font,
                            NSParagraphStyleAttributeName: paragraphStyle };
        
        CGRect textRect = [text boundingRectWithSize:size
                                         options:NSStringDrawingUsesLineFragmentOrigin
                                      attributes:attributes
                                         context:nil];
        
        CGSize size = textRect.size;
        

        来自两个答案1 + 2

        【讨论】:

          猜你喜欢
          • 2013-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          • 2014-01-14
          • 2021-09-03
          相关资源
          最近更新 更多