sizeWithFont:在 iOS 7 中

Posted

技术标签:

【中文标题】sizeWithFont:在 iOS 7 中【英文标题】:sizeWithFont: in iOS 7 【发布时间】:2013-09-27 07:30:37 【问题描述】:

我收到警告:“'sizeWithFont:constrainedToSize:lineBreakMode:' 已弃用:ios 7.0 中首次弃用” 任何人都可以建议我使用这种方法的替代方法吗?

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

// Calculate height based on cell content — cell content will stretch appropriately when the height is set
Post *post = self.articleComments[indexPath.row];
CGFloat width = tableView.frame.size.width - 71 - 15;  // Width of comment text area
UIFont *commentFont = [UIFont fontWithName:@"SeroCompPro-Light" size:14];
CGFloat commentTextHeight = [post.text sizeWithFont:commentFont constrainedToSize:CGSizeMake(width, 10000) lineBreakMode:NSLineBreakByWordWrapping].height;

return commentTextHeight + 31 + 37;
  

【问题讨论】:

Replacement for deprecated sizeWithFont: in iOS 7? 的可能重复项 是的,但那是 CGRect ,我需要 CGFloat 。 请查看我的回答***.com/questions/18903304/… 再次是 CGRect 我需要 CGfloat ,CGFloat commentTextHeight = [post.text sizeWithFont:commentFont constrainedToSize:CGSizeMake(width, 10000) lineBreakMode:NSLineBreakByWordWrapping].height; 这是我收到警告的行,我的输出显示不正确。 【参考方案1】:

替代方案是:

- (NSSize)sizeWithAttributes:(NSDictionary *)attributes

在你的情况下:

[string sizeWithAttributes:@NSFontAttributeName:[UIFont fontwithName:@"SeroCompPro-Light" size:14]];

【讨论】:

【参考方案2】:

此功能在 ios 7 中已弃用。 而不是这个函数

sizeWithFont:constrainedToSize:lineBreakMode

使用这个功能,使用

- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context

 boundingRectWithSize:options:attributes:context:

计算并返回使用给定选项和显示特性绘制的接收器的边界矩形,在当前图形上下文中的指定矩形内。

参数 尺寸 要绘制的矩形的大小。

选项 字符串绘制选项。

属性 要应用于字符串的文本属性字典。这些是可以应用于NSAttributedString 对象的相同属性,但在NSString 对象的情况下,这些属性应用于整个字符串,而不是字符串中的范围。 上下文

用于接收器的字符串绘制上下文,指定最小比例因子和跟踪调整。

【讨论】:

该功能从iOS 7开始可用,所以要注意向后兼容性。【参考方案3】:

我使用了下面的代码,它可以工作:

NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@
     
     NSFontAttributeName: font
     ];

    CGRect rect = [attributedText boundingRectWithSize:(CGSize)size.width, CGFLOAT_MAX
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];

    result = CGSizeMake(ceilf(rect.size.width), ceilf(rect.size.height));

使用 ceilf 方法创建 NSAttributedString 并获得正确的宽度高度时出现问题

【讨论】:

【参考方案4】:

支持IOS7及更低版本的替代方案-

CGSize expectedLabelSize;
if ([self respondsToSelector:@selector(sizeWithAttributes:)])

    expectedLabelSize = [subTitle sizeWithAttributes:@NSFontAttributeName:subTitleLabel.font];
else
    expectedLabelSize = [subTitle sizeWithFont:subTitleLabel.font constrainedToSize:subTitleLabel.frame.size lineBreakMode:NSLineBreakByWordWrapping];

【讨论】:

以上是关于sizeWithFont:在 iOS 7 中的主要内容,如果未能解决你的问题,请参考以下文章

sizeWithFont: ConstrainedToSize: lineBreakMode: 方法在 iOS 7 中已弃用

sizeWithFont ios 7.0 已弃用 [重复]

从 sizewithFont:constrainedToSize:lineBreakMode: 过渡到 iOS 7 的行为不符合预期

sizeWithFont:constrainedToSize:lineBreakMode: 在 iOS7 中已弃用

iOS 7 中具有 UITextView 高度的 UITableViewCell?

使用 NSAttributedString iOS 自定义 heightForRowAtIndexPath (CGSize sizeWithFont)