gpt4 book ai didi

ios - 'sizeWithFont :constrainedToSize:lineBreakMode:'is deprecated:

转载 作者:IT王子 更新时间:2023-10-29 07:49:18 26 4
gpt4 key购买 nike

在 Xcode 5 上将项目从 iOS5.0 转换为 iOS7/iOS6。下面的代码给出了编译时警告:

'sizeWithFont:constrainedToSize:lineBreakMode:'已弃用:首先在 ios 7.0 中弃用 - 使用 - boundingRectWithSize:options:attribiutes:context

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
self.lblHidden.frame = CGRectMake(58, 228, 945, 9999);
self.lblHidden.text = detailShareObj.pDesc;
CGSize size = [detailShareObj.pDesc sizeWithFont:self.lblHidden.font constrainedToSize:self.lblHidden.frame.size lineBreakMode:NSLineBreakByWordWrapping];
return 228.0+size.height+20;

}
else if (indexPath.section == 1)
{
NSString *tempPointStr = (self.shortDescArray)[indexPath.row];

self.lblHidden.frame = CGRectMake(58, 0, 945, 9999);
self.lblHidden.text = tempPointStr;
CGSize size = [tempPointStr sizeWithFont:self.lblHidden.font
constrainedToSize:self.lblHidden.frame.size
lineBreakMode:NSLineBreakByWordWrapping];

return 50.0f;
}

我尝试了其他地方给出的一些建议,但如果有人可以通过提供代码中所需的更正来提供帮助,我将不胜感激。

最佳答案

我不会只是掩盖已弃用的函数警告。他们弃用它是有原因的。我认为该函数已被弃用,因为该系列的 NSString+UIKit 函数基于 UIStringDrawing 库,该库不是线程安全的。如果您尝试不在主线程上运行它们(就像任何其他 UIKit 功能一样),您将获得不可预知的行为。特别是,如果您同时在多个线程上运行该函数,它可能会使您的应用程序崩溃。这就是为什么在 iOS 6 中,他们为 NSAttributedStrings 引入了 boundingRectWithSize:... 方法。这是建立在 NSStringDrawing 库之上的,并且是线程安全的。

如果您查看新的 NSString boundingRectWithSize:... 函数,它会以与 NSAttributeString 相同的方式请求属性数组。如果非要我猜的话,iOS 7 中的这个新 NSString 函数只是 iOS 6 中 NSAttributeString 函数的包装器。

关于这一点,如果您只支持 iOS 6 和 iOS 7,那么我肯定会将您所有的 NSString 的 sizeWithFont:... 更改为 NSAttributeString 的 boundingRectWithSize .如果你碰巧有一个奇怪的多线程角落案例,它会让你省去很多麻烦!下面是我如何转换 NSString 的 sizeWithFont:constrainedToSize::

曾经是什么:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font
constrainedToSize:(CGSize){width, CGFLOAT_MAX}];

可以替换为:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
[[NSAttributedString alloc]
initWithString:text
attributes:@
{
NSFontAttributeName: font
}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;

请注意文档中提到的:

In iOS 7 and later, this method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function.

因此,为了提取用于调整 View 大小的计算高度或宽度,我会使用:

CGFloat height = ceilf(size.height);
CGFloat width = ceilf(size.width);

关于ios - 'sizeWithFont :constrainedToSize:lineBreakMode:'is deprecated:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18922252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com