19

所以,它似乎heightForRowAtIndexPath是之前调用的cellForRowAtIndexPath。我目前正在使用cellForRowAtIndexPath计算每个单元格的高度(它们是可变高度,使用其中UILabel包含不同数量的文本。

如果在计算它的方法之前调用设置高度的方法,我对如何正确设置单元格的高度感到困惑。

我创建了一个 类别NSString和另一个类别UILabel,它们一起工作以UILabel形成正确的大小。问题是UITableViewCell包含这些标签的实例没有被调整大小,因此标签挂在每个标签的末端,与下面的标签重叠。

我知道我需要做的是使单元格的高度等于标签的高度,加上一些额外的边距空间,但我很困惑如何在计算标签高度之前设置高度。我可以在不使用的情况下设置某人的高度heightForRowAtIndexPath吗?或者如果没有,我可以计算其他地方的单元格的高度吗?我目前正在使用indexPath.row它来实现这一点,所以事先这样做会很棘手。这是我的 cellForRowAtIndexPath 的代码:

cellForRowAtIndexPath

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
    FQCustomCell *_customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"];
    if (_customCell == nil) {
        _customCell = [[FQCustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"];
    }

    _customCell.myLabel.text = [[_loadedNames objectAtIndex: indexPath.row] name];
    _customCell.myLabel.font = [UIFont fontWithName: @"FontA" size: 15.0f];

    UIView *backView = [[UIView alloc] initWithFrame: CGRectZero];
    backView.backgroundColor = [UIColor clearColor];
    _customCell.backgroundView = backView;

    _customCell.myLabel.frame = CGRectMake(5, 5, 265, 65);

    [_customCell.myLabel sizeToFitMultipleLines];
    return _customCell;
}
4

3 回答 3

15

您需要计算单元格的高度heightForRowAtIndexPath,例如

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *theText=[[_loadedNames objectAtIndex: indexPath.row] name];
    CGSize labelSize = [theText sizeWithFont:[UIFont fontWithName: @"FontA" size: 15.0f] constrainedToSize:kLabelFrameMaxSize];
    return kHeightWithoutLabel+labelSize.height;
}

您可以通过设置对标签大小设置一些约束kLabelFrameMaxSize

#define kLabelFrameMaxSize CGSizeMake(265.0, 200.0)

然后通过添加一个带有变量标签高度的恒定高度来返回高度。

此外,为了保持一致,您应该使用相同的方法来设置框架,cellForRowAtIndexPath而不是使用sizeToFitMultipleLines

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
    FQCustomCell *_customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"];
    if (_customCell == nil) {
        _customCell = [[FQCustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"];
    }

    _customCell.myLabel.text = [[_loadedNames objectAtIndex: indexPath.row] name];
    _customCell.myLabel.font = [UIFont fontWithName: @"FontA" size: 15.0f];

    UIView *backView = [[UIView alloc] initWithFrame: CGRectZero];
    backView.backgroundColor = [UIColor clearColor];
    _customCell.backgroundView = backView;

    CGSize labelSize = [_customCell.myLabel.text sizeWithFont:_customCell.myLabel.font constrainedToSize:kLabelFrameMaxSize];
    _customCell.myLabel.frame = CGRectMake(5, 5, labelSize.width, labelSize.height);

    return _customCell;
}
于 2013-02-19T11:27:56.907 回答
1

heightForRowAtIndexPath您应该在方法中计算单元格的高度。它应该在不使用任何 UILabel 的情况下完成,就像heightForRowAtIndexPathJP Hribovsek 的答案中的实现一样。

然后在cellForRowAtIndexPath不设置任何子视图的框架并且不调用sizeToFitMultipleLines标签的方法。相反,实现这样的layoutSubviews方法,FQCustomCell以便为单元格的任何可能边界正确设置子视图框架。您不应该关心此方法中的文本或字体大小,只需确保标签的边距正确即可。如果在方法中正确计算单元格的高度,则heightForRowAtIndexPath标签的大小将恰到好处。

于 2013-02-19T15:30:46.467 回答
-2

对于每个单元格 heightforRowAtIndexPath ,首先调用,然后调用 CellForRowAtIndexPath 。因此,您可以先计算高度,然后为每个单元格填充 CellForRowAtIndexPath 中的数据。

于 2013-02-19T11:32:13.143 回答