从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?

Posted

技术标签:

【中文标题】从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?【英文标题】:Calling heightForRowAtIndexPath from within cellForRowAtIndexPath? 【发布时间】:2013-02-19 11:20:11 【问题描述】:

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

如果在计算方法之前调用设置高度的方法,我不知道如何正确设置单元格的高度。 p>

我创建了一个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;

【问题讨论】:

ios 8 开始,您还可以使用自动计算的动态行高。 ***.com/questions/18746929/… 【参考方案1】:

你需要计算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;

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

首先调用每个单元格 heightforRowAtIndexPath ,然后调用 CellForRowAtIndexPath 。所以你可以先计算高度,然后在 CellForRowAtIndexPath 中为每个单元格填充数据。

【讨论】:

以上是关于从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 数据源必须从 tableView 返回单元格:cellForRowAtIndexPath

UITableView dataSource 必须从 tableView:cellForRowAtIndexPath 返回一个单元格:

uitableview 单元格 cellForRowAtindexPath 从 swift3 中的名称中提取第一个字母

从情节提要加载 UILabel,无法更改 cellForRowAtIndexPath 中的框架

如何从 cellForRowAtIndexPath 获取 textField 上的边框线?

UITableView dataSource 必须从 tableView:cellForRowAtIndexPath 返回一个单元格