- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 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/
我正在尝试使用sizeWithFont,如下所示: [commentTextLabel.text sizeWithFont:commentTextLabel.font
我在sizeWithFont(特别是lineBreakMode)上遇到了一些麻烦。 CGSize maxSize = CGSizeMake(30, 999); UIFont *font = [UIFo
我正在 iPhone 上制作聊天应用程序。我对 sizeWithFont:constrainedToSize:lineBreakMode 函数有疑问。当 NSString 有 long length
尝试创建 CGSize 来设置 UILabel 的正确高度时出现泄漏。在 heightForRowAtIndexPath 中设置高度时,我也收到相同的泄漏。 这是泄漏的代码片段: CGSize siz
所以我刚刚浏览了一个旧的 iOS 项目,下面一行说它已弃用: CGSize stringSize = [string sizeWithFont:self.stringLabel.font constr
我有以下代码: float height = [string sizeWithFont:[UIFont systemFontOfSize:kFontSize] constrainedToSize:CG
sizeWithFont:constrainedToSize:lineBreakMode: 似乎没有返回正确的宽度。执行这些代码后,我看到标签中的部分字符串被截断了,这意味着我必须手动添加几个像素的大
不要与返回 CGSize 的 NSString sizeWithFont 方法混淆,我正在寻找的是返回 NSString 的方法> 受限于某个 CGSize。我想要这样做的原因是当使用 Core Te
我正在将我的应用程序更新到iOS 7,终于得到了它,但是有一件事我找不到解决方案。 在Xcode 4中,我使用了以下方法: #define FONT_SIZE 14.0f #define CELL_C
我已经阅读了很多关于该主题的问题,但我似乎无法找到我的代码有什么问题: UILabel *nameLabel = [[UILabel alloc] init]; [nameLabel setText:
在 Xcode 5 上将项目从 iOS5.0 转换为 iOS7/iOS6。下面的代码给出了编译时警告: 'sizeWithFont:constrainedToSize:lineBreakMode:'已
我正在尝试制作一个 UITableViewCell,根据它显示的字符串的长度来调整其高度,但我对此方法很感兴趣。 这是我得到的: NSString *text = @"A really long st
AppKit(适用于 Mac OS X 上的 Cocoa)中是否有任何等效方法与 UIKit 的 [NSString sizeWithFont:constrainedToSize:] 执行相同的操作?
我已经浏览了 SO 上关于此方法的每一篇文章的感觉。许多海报的答案都是设置一个非常大的值作为高度约束。 但是,对我来说这不起作用。这是我的代码: //Create the contentLabel L
我有一个字幕样式 UITableViewCell,其高度根据每个字段的文本长度动态变化。问题是,如果标签有多行,textLabel 的高度(CGSize 大小)不会增加。 奇怪的是,detailTex
当我运行以下代码时(iOS 6.1 SDK): UIFont *font = [UIFont fontWithName:@"Avenir" size:12.0]; NSString *text1 =
在 iOS 7 中,方法: - (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lin
UILabel 位于 UITableViewCell 内。点击单元格时,高度会扩展,并且会出现第二个 UILabel,其中包含不同数量的数据。 问题是,如果换行,sizeWithFont:constr
我怎样才能转换 CGSize labelHeighSize = [text sizeWithFont: [UIFont systemFontOfSize:16] constrainedToSize:
这个问题在这里已经有了答案: Replacement for deprecated -sizeWithFont:constrainedToSize:lineBreakMode: in iOS 7?
我是一名优秀的程序员,十分优秀!