sizeWithFont:和sizeWithAttributes:不适用于长单行

时间:2016-01-14 08:41:17

标签: objective-c uitableview cell row-height

我正在尝试为表格中的单元格设置动态高度,高度应基于文本长度和最大宽度。

当此文本出现在单行中而没有行分隔符时,会出现此问题。无论文本有多大,如果没有行分隔符,它会检测到文本只适合一行,因此我的单元格高度不会增加。

我做错了吗?我怎样才能实现它?感谢。

signal2(t)=signal1(t+T)

}

2 个答案:

答案 0 :(得分:2)

有一种更简单的方法可以做到这一点:

首先将文本设置为UILabel,然后设置所有必需的字体,大小。然后在标签上调用sizeThatFits方法。

  

CGSize sizze =[itemLabel sizeThatFits:CGSizeMake(itemNameLabelWidth, CGFLOAT_MAX)];

也不要忘记在致电numberOfLines之前设置lineBreakModesizeThatFits:

itemLabel.numberOfLines=0;
itemLabel.lineBreakMode=NSLineBreakByWordWrapping;

注1 :调用sizeThatFits不会将新帧设置为UILabel,它只是计算并返回新帧。然后,您必须通过添加x和y原点值将帧设置为标签。这就变成了:

CGSize sizze =[itemLabel sizeThatFits:CGSizeMake(itemNameLabelWidth, CGFLOAT_MAX)];
CGRect namelabelFrame = itemLabel.frame;
namelabelFrame.size = sizze;
itemLabel.frame = namelabelFrame;

注意2 :此代码在cellForRowAtIndexPath:中没问题,但在计算heightForRowAtIndexPath:内的高度时,您可能希望稍微优化此代码。由于您没有要使用的单元格,因此可以初始化UILabel对象并在其上执行此代码以估计高度。但在UIView内进行heightForRowAtIndexPath:初始化并不是一个好主意,因为它们会在滚动时显着影响性能。

所以你所做的是将已经初始化(并应用​​所有格式)UILabel作为类变量,并将其重用于高度计算。

答案 1 :(得分:2)

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

你应该使用“boundingRectWithSize:options:attributes:context:”而不是“sizeWithAttributes:”。

这是一个样本

CGSize size = [text boundingRectWithSize:CGSizeMake(_myTableView.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} context:nil].size;