在cellForRowAtIndexPath中调用heightForRowAtIndexPath?

所以,似乎在cellForRowAtIndexPath之前调用了heightForRowAtIndexPath 。 我目前正在使用cellForRowAtIndexPath来计算每个单元格的高度(他们是variables的高度,使用UILabel不同的文本量。

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

我创build了一个NSString的类别,和另一个UILabel ,它们一起使UILabel成为正确的大小。 问题是包含这些标签的UITableViewCell实例没有被resize,所以标签挂在每个标签的末尾,重叠在下面。

我知道我需要做的是使单元格的高度与标签的高度相等,再加上一些额外的空白空间,但是我很疑惑如何在标签高度计算之前设置高度。 我可以在不使用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; } 

你需要在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; } 

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

然后在cellForRowAtIndexPath不要设置任何子视图的框架,也不要调用标签的sizeToFitMultipleLines方法。 而应该实现FQCustomCell layoutSubviews方法, FQCustomCell为单元格的任何可能边界正确设置子视图帧。 你不应该关心这个方法中的文本或字体大小,只要确保标签的边距是正确的。 如果在heightForRowAtIndexPath方法中正确计算单元格的高度,则标签的大小将恰到好处。

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