我有一些UITableViewCells需要根据内部字符串的长度来改变它们的高度。我正在计算tableView:cellForRowAtIndexPath:
内的必要高度,然后将其存储在变量(self.specialRowHeight
)中。然后我得到了:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == SPECIAL_SECTION) {
return self.specialRowHeight;
}
else {
return 44;
}
}
除了似乎在tableView:cellForRowAtIndexPath:
位之前被调用,所以它始终为零。
有没有办法绕过这个,或者采用不同的方式来做到这一点?
谢谢!
答案 0 :(得分:11)
这里要回答我自己的问题:
最初我非常确定高度计算与tableView:cellForRowAtIndexPath:
方法有关,并且无法移动到其他位置。然而,通过一系列重组,我能够将那些东西从那里转移到tableView:heightForRowAtIndexPath:
,这可以解决所有问题。
对于那些试图让自动调整高度的单元格工作的人来说,这里有一些可能有用的代码:
// Inside tableView:cellForRowAtIndexPath:
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = self.numberOfTextRows;
// numberOfTextRows is an integer, declared in the class
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGSize theSize = [theObject.theStringToDisplay sizeWithFont:[UIFont systemFontOfSize:18.0f] constrainedToSize:CGSizeMake(265.0f, 9999.0f) lineBreakMode:UILineBreakModeWordWrap];
// This gets the size of the rectangle needed to draw a multi-line string
self.numberOfTextRows = round(theSize.height / 18);
// 18 is the size of the font used in the text label
// This will give us the number of lines in the multi-line string
if ((indexPath.section == FIXED_HEIGHT_SECTION) || (self.numberOfTextRows < 2)) {
return 44;
// 44 is the default row height; use it for empty or one-line cells (or in other table sections)
} else {
return theSize.height + 16;
// 16 seems to provide a decent space above/below; tweak to taste
}
}
如果你能想出一种更准确的方法来计算正确的细胞高度,那我就是耳朵。 :)
答案 1 :(得分:0)
你可以将self.numberOfLines设置为0一次,它将工作相同。 (如果numberOfLines设置为0,则标签将使用所需的行数。)
答案 2 :(得分:-7)
我的解决方案是在tableView:cellForRowAtIndexPath:
的实现中调用tableView:heightForRowAtIndexPath:
,如下所示
- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
[self tableView:aTableView cellForRowAtIndexPath:indexPath];
return headerHeight;
}