在iOS 7中替换已弃用的sizeWithFont:minFontSize:actualFontSize方法

6
在 iOS 6 中,我使用了这个方法:
[self.handText sizeWithFont:font 
 minFontSize:10.0f 
 actualFontSize:&maxFontSize 
 forWidth:handWidth/2 
 lineBreakMode:UILineBreakModeClip];

xcode 5 表示 'sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:' 已经过时:iOS 7 开始废弃使用

现在我已按以下方式进行实现:

[self.handText sizeWithAttributes:@{NSFontAttributeName:font} 
 minFontSize:10.0f 
 actualFontSize:&maxFontSize 
 forWidth:handWidth/2 
 lineBreakMode:NSLineBreakByClipping];

在这里,Xcode会抛出另一个警告,说:

'Instance method -sizeWithAttributed:minFontSize:forWidth:lineBreakMode:'not found(return type defaults to 'id')

请问有人能帮我解决这个警告吗?

3个回答

8
请使用这个辅助方法代替:
-(CGSize)frameForText:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode  {

    NSMutableParagraphStyle * paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    paragraphStyle.lineBreakMode = lineBreakMode;

    NSDictionary * attributes = @{NSFontAttributeName:font,
                                  NSParagraphStyleAttributeName:paragraphStyle
                                  };


    CGRect textRect = [text boundingRectWithSize:size
                                         options:NSStringDrawingUsesLineFragmentOrigin
                                      attributes:attributes
                                         context:nil];

    //Contains both width & height ... Needed: The height
    return textRect.size;
}

如果需要支持iOS 6和iOS 7,请按如下方式使用:

#ifdef __IPHONE_7_0

     titleSize = [self frameForText:self.titleLabel.text sizeWithFont:self.titleLabel.font constrainedToSize:CGSizeMake(labelMaxWidth,self.titleLabel.font.lineHeight) lineBreakMode:self.titleLabel.lineBreakMode ];

     subtitleSize = [self frameForText:self.subtitleLabel.text sizeWithFont:self.subtitleLabel.font  constrainedToSize:CGSizeMake(labelMaxWidth,self.subtitleLabel.font.lineHeight) lineBreakMode:self.subtitleLabel.lineBreakMode];

#else


     titleSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font
                                        constrainedToSize:CGSizeMake(labelMaxWidth,self.titleLabel.font.lineHeight)
                                            lineBreakMode:self.titleLabel.lineBreakMode];

     subtitleSize =   [self.subtitleLabel.text sizeWithFont:self.subtitleLabel.font
                                              constrainedToSize:CGSizeMake(labelMaxWidth,self.subtitleLabel.font.lineHeight)
                                                  lineBreakMode:self.subtitleLabel.lineBreakMode];
#endif

5
这不是一个等价的解决方案,对吗?原来提问者使用的方法会在actualFontSize不适合限制条件时测试各种大小。但是这个答案中的解决方案似乎没有这样做...? - Greg Maletic

2
方法签名是:
- (CGSize)sizeWithAttributes:(NSDictionary *)attrs

这意味着您不能指定比第一个参数(属性数组)更多的参数。因此,您基本上使用了一个在iOS SDK中不存在的方法(sizeWithAttributed:minFontSize:forWidth:lineBreakMode:)。
为了解决问题,请参考这个问题的解决方法。

1
你可以使用这个方法。
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(7_0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接