我正在尝试为表格中的单元格设置动态高度,高度应基于文本长度和最大宽度。
当此文本出现在单行中而没有行分隔符时,会出现此问题。无论文本有多大,如果没有行分隔符,它会检测到文本只适合一行,因此我的单元格高度不会增加。
我做错了吗?我怎样才能实现它?感谢。
signal2(t)=signal1(t+T)
}
答案 0 :(得分:2)
有一种更简单的方法可以做到这一点:
首先将文本设置为UILabel
,然后设置所有必需的字体,大小。然后在标签上调用sizeThatFits
方法。
CGSize sizze =[itemLabel sizeThatFits:CGSizeMake(itemNameLabelWidth, CGFLOAT_MAX)];
也不要忘记在致电numberOfLines
之前设置lineBreakMode
和sizeThatFits:
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;