因此,似乎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;
}
答案 0 :(得分: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;
}
答案 1 :(得分:1)
您应该使用heightForRowAtIndexPath
方法计算单元格的高度。它应该在不使用任何UILabel的情况下完成,就像在JP Hribovsek的回答中heightForRowAtIndexPath
实现一样。
然后在cellForRowAtIndexPath
中不设置任何子视图的框架,也不要调用标签的sizeToFitMultipleLines
方法。相反,实现layoutSubviews
的{{1}}方法,以便为单元格的任何可能边界正确设置子视图帧。您不应该关心此方法中的文本或字体大小,只需确保标签的边距正确即可。如果使用FQCustomCell
方法正确计算单元格的高度,则标签的大小将恰到好处。
答案 2 :(得分:-1)
首先调用每个单元格heightforRowAtIndexPath,然后调用CellForRowAtIndexPath。因此,您可以先计算高度,然后在CellForRowAtIndexPath中为每个单元格填充数据。