我正在使用默认的UITableViewCell,只是它的textLabel。我的文字是多行的。计算高度的最佳方法是什么?
我知道有各种NSString大小调整方法,但为了使用它们,您必须指定宽度。而且我不知道默认textLabel的宽度,我怀疑它会根据放在其中的文本而改变。
我也试过使用这里描述的方法:
Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
...但它不起作用(估计大小总是回来0);在该帖子中有一个暗示,该解决方案仅适用于UITableViewCell子类。 (我可以继承,但没有必要。)
连连呢?我的应用程序是iOS 7特定的。
谢谢!
答案 0 :(得分:2)
UITableView rowHeight
财产。如果您未明确设置,UITableView
会将其设置为标准值。
答案 1 :(得分:2)
我使用标准的UITableViewCell - 使用你列出的问题中的github,但是替换这些函数。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 0;
cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}
// Configure the cell for this indexPath
//[cell updateFonts];
NSDictionary *dataSourceItem = [self.model.dataSource objectAtIndex:indexPath.row];
cell.textLabel.text =[dataSourceItem valueForKey:@"body"];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSDictionary *dataSourceItem = [self.model.dataSource objectAtIndex:indexPath.row];
NSString *cellText = [dataSourceItem valueForKey:@"body"];
UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
return labelSize.height;
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (self.isInsertingRow) {
// A constraint exception will be thrown if the estimated row height for an inserted row is greater
// than the actual height for that row. In order to work around this, we return the actual height
// for the the row when inserting into the table view.
// See: https://github.com/caoimghgin/TableViewCellWithAutoLayout/issues/6
return [self tableView:tableView heightForRowAtIndexPath:indexPath];
} else {
return 500.0f;
}
}
哦也删除了自定义单元类的寄存器,所以我们得到一个UITableViewCell而不是RJTableViewCell。我也想到这里(即使它是一个UITableViewCell)dequeueReusableCellWithIdentifier
永远不会返回nil,我们也不会正确设置我们的单元格。
- (void)viewDidLoad
{
[super viewDidLoad];
//[self.tableView registerClass:[RJTableViewCell class] forCellReuseIdentifier:CellIdentifier];
...
}
此处基本上遵循此示例 - https://stackoverflow.com/questions/129502/how-do-i-wrap-text-in-a-uitableviewcell-without-a-custom-cell。我认为关键是不要像单元格子类那样向单元格询问它的高度,而是根据文本和字体来计算它。事实上,你无法向细胞询问它的高度似乎对我来说有点奇怪,让我觉得@Jeffery Thomas也许是对的,从长远来看,创建自定义细胞可能会更安全。可能取决于我猜的你的项目。
答案 2 :(得分:0)
您需要继承UITableViewCell
。
您要求UITableViewCell
提供的内容超出其承诺提供的内容。这是一个麻烦的方法。
创建子类并构建原型。你会知道所有的约束,所以这很容易。