sizeWithFont:constrainedToSize:lineBreakMode:iOS7中不推荐使用

时间:2013-09-16 17:52:56

标签: uitableview ios7 deprecated

我正在将我的应用更新到iOS 7并最终得到它,但有一件事我无法找到解决方案。

在Xcode 4中,我使用了以下方法:

#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 280.0f
#define CELL_CONTENT_MARGIN 10.0f


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; {
    NSString *text = [textA objectAtIndex:[indexPath row]];

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];

    CGFloat height = MAX(size.height, 28.0f);

    return height + (CELL_CONTENT_MARGIN * 2);
}

但是在iOS 7中使用它时会出错:

  

使用-boundingRectWithSize:options:attributes:context:

我不知道如何将我的早期版本转换为这种新方法,如果有人能帮助我,那将会很棒。提前谢谢。

3 个答案:

答案 0 :(得分:5)

在iOS7中不推荐使用

sizeWithFont 方法。您应该使用 boundingRectWithSize 。如果您还需要支持以前的iOS版本,那么您可以使用以下代码:

CGSize size = CGSizeZero;

if ([label.text respondsToSelector: @selector(boundingRectWithSize:options:attributes:context:)] == YES) {
    size = [label.text boundingRectWithSize: constrainedSize options: NSStringDrawingUsesLineFragmentOrigin
                                 attributes: @{ NSFontAttributeName: label.font } context: nil].size;
} else {
    size = [label.text sizeWithFont: label.font constrainedToSize: constrainedSize lineBreakMode: UILineBreakModeWordWrap];
}

答案 1 :(得分:4)

如果您只支持ios6及更高版本,则可以将NSStrings转换为NSAttributedStrings并使用NSAttributedString的{​​{1}}。

以前看起来像这样的东西:

boundingRectWithSize:options:context:

可以轻松转换为此功能并在ios6和ios7中均可使用:

CGSize size = [text sizeWithFont:font
               constrainedToSize:(CGSize){maxWidth, CGFLOAT_MAX}];

作为旁注,以这种方式做事的好处是因此ios6中的文本大小现在是线程安全的。 NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@ { NSFontAttributeName: font }]; CGRect rect = [attributedText boundingRectWithSize:(CGSize){maxWidth, CGFLOAT_MAX} options:NSStringDrawingUsesLineFragmentOrigin context:nil]; CGSize size = rect.size; 的旧方法属于UIStringDrawing,如果您同时在两个线程上运行sizeWithFont:...,则会崩溃。在ios6中,公开了sizeWithFont:...的新NSStringDrawing函数,NSAttributedStrings函数是线程安全的。我猜这就是为什么在ios7中,旧的boundingRectWithSize:...函数已被弃用。

请注意文档提及:

  

在iOS 7及更高版本中,此方法返回小数(大小)   返回的CGRect的组件);使用返回的大小来确定大小   视图,必须使用将其值提高到最接近的更高整数   使用ceil函数。

因此,要拉出用于调整视图大小的计算高度或宽度,我会使用:

sizeWithFont:...

答案 2 :(得分:2)

您正在使用的

sizeWithFont API在iOS7上已弃用。

// See UIStringDrawing.h
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:"); // NSTextAlignment is not needed to determine size

您可以像这样使用API​​建议:

NSMutableDictionary *atts = [[NSMutableDictionary alloc] init];
[atts setObject:myFont forKey:NSFontAttributeName];

CGRect rect = [myText boundingRectWithSize:constraint
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:atts
                                 context:nil];