在 cellForRow 中设置一个浮点数 .. 并在 heightForRow 中设置 return

Set a float in cellForRow.. and return it in heightForRow

我有一个带有标签的自定义单元格。我想要做的是在 cellForRow... 中制作标签 sizeToFit 并将标签高度传递给名为 labelHeight 的变量。然后在 heightForRow... 我想 return labelHeight.

问题是,它 return 的高度为 0。这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...
    [customCell.label sizeToFit];
    self.labelHeight = customCell.label.frame.size.height;
    ...
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    return self.labelHeight;
}

我认为没有很好的解决方案,因为 heightForRowAtIndexPathcellForRowAtIndexPath 之前被调用。

你可以:

  • 通过计算具有特定字体(样式和大小)的文本数量将占用的大小来计算 heightForRowAtIndexPath 上单元格的高度:

    CGSize size = [string sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];    
    CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
    

或者您可以模拟整个视图以获得更精确的结果(但计算成本会更高)或

  • cellForRowAtIndexPath
  • 上计算单元格高度后重新加载表格视图

如果您需要计算 heightForRowAtIndexPath 最简单的方法(尽管感觉效率低下)是使用 heightForRow 调用 cellForRowAtIndexPath... 然后在 table 上重新加载调用,这将再次调用 cellForRow.. . 由于单元格的双重创建,这感觉很脏,如果您能够使用动态常量简化已知常量的高度计算因子,这可能会更有效但代码更多。例如

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath(NSIndexPath *)indexPath{
  NSString *string = self.objects[indexPath.row];
  NSDictionary *textAttributes = nil; //attributes here

  return self.someButton.frame.size.height +
        self.someSwitch.frame.size.height +
        [string boundingRectWithSize:CGSizeMake(LABEL_WIDTH, CGFLOAT_MAX)
                       options:NSStringDrawingUsesLineFragmentOrigin
                    attributes:textAttributes
                       context:nil].size.height;
} 

如果您能够支持 iOS 8+ 并且正在使用自动版式,则更好的解决方案是将 table 视图上的 -estimatedRowHeight 属性 设置为一个非零值,那么单元格上的 UILayoutConstraints 将能够为您计算。这是对 iOS8 中 tableViews 的一个非常受欢迎的新补充,并且在其中一个 WWDC 视频中进行了描述。但如果单元格上没有自动布局,它就无法工作。