我在UITableViewCell中有一个UILabel。我没有使用autolayout,而是手动创建和添加视图。 UILabel可以包含可变数量的文本,因此在我的tableview委托中我实现了heightForRowAtIndexPath。
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
TableCellWithDocument *cell = (TableCellWithDocument*)[self tableView: tableView cellForRowAtIndexPath: indexPath];
NSLog(@"Cell frame: %@", NSStringFromCGRect(cell.frame));
return [cell heightForCellForWidth: cell.frame.size.width];
我遇到的问题是,当调用此委托方法时,单元格的帧大小不正确。它只返回“默认”320x44。 因此,当我尝试计算标签大小时,我的单元格宽度错误,单元格高度错误。
在我的子类TableCellWithDocument类中,我可以覆盖layoutSubviews并获取正确的单元格宽度,但是由于已经调用了heightForRowAtIndexPath,所以为时已晚。
我该如何处理?
答案 0 :(得分:0)
你是以递归的方式做的。如果您仔细调试代码,您会发现首先调用heightForRowAtIndexPath
来估计单元格高度,稍后调用cellForRowAtIndexPath
。
理想情况下,在heightForRowAtIndexPath
内,您应该获取所有数据源内容,并估算其大小。 cellForRowAtIndexPath
应该能够使用此高度来设置单元格内容。
例如,如果要显示某些文字,您可以使用[UILabel sizeThatFits]
或[NSString sizeWithFont]
方法估算cell.textLabel
尺寸,依此类推。
请记住,没有答案是正确答案,您必须根据自己的数据进行调整 - 无论是字符串,图像还是其他任何内容。这是数据大小,而不是控件的大小 - 必须决定从heightForRowAtIndexPath
返回的内容。
答案 1 :(得分:0)
尝试在你的heightForRowAtIndexPath
中执行此操作- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGSize size = [text sizeWithFont:[UIFont fontWithName: @"YourFont" size:24.0];
constrainedToSize:CGSizeMake(kMessageTextWidth, CGFLOAT_MAX)
lineBreakMode:NSLineBreakByWordWrapping];
return MAX(size.height + 17.0f);
}