获取tableView:heightForRowAtIndexPath:在tableView之后发生:cellForRowAtIndexPath:?

时间:2009-08-30 01:21:27

标签: iphone cocoa-touch uitableview

我有一些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:位之前被调用,所以它始终为零。

有没有办法绕过这个,或者采用不同的方式来做到这一点?

谢谢!

3 个答案:

答案 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;
}