当我创建自己的UITableViewCell
时,我使用layoutSubviews
来排列单元格中的元素。
但是,如何创建适合所需行数的区域 - 具体取决于描述文本的长度。
-(void) layoutSubviews {
[super layoutSubviews];
[imageView setFrame:CGRectMake(8.0, 10.0, 20.0, 20.0)];
[description setFrame:CGRectMake(40.0, 1.0, 250.0, 40.0)]; //1..n lines <- ???????
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
imageView = [[UIImageView alloc] initWithFrame: CGRectZero];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.contentView addSubview: imageView];
titleLabel = [[UILabel alloc] initWithFrame: CGRectZero];
[titleLabel setFont:[UIFont systemFontOfSize:14.0]];
[titleLabel setTextColor:[UIColor blackColor]];
[titleLabel setHighlightedTextColor:[UIColor darkGrayColor]];
[titleLabel setLineBreakMode: NSLineBreakByWordWrapping];
//titleLabel.numberOfLines = 2;
[self.contentView addSubview: titleLabel];
description = [[UILabel alloc] initWithFrame: CGRectZero];
[description setFont:[UIFont systemFontOfSize:12.0]];
[description setTextColor:[UIColor darkGrayColor]];
[description setHighlightedTextColor:[UIColor darkGrayColor]];
[description setLineBreakMode: NSLineBreakByWordWrapping];
//description.numberOfLines = 1; //1..n lines <- ???????
[self.contentView addSubview: description];
}
答案 0 :(得分:1)
您必须通过计算要将其放置在单元格中的字符串(单元格内容)的大小来获取单元格的高度。此计算应该在:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
计算高度后,您必须相应地调整/放置单元格内的元素框架(单元格内容)。
答案 1 :(得分:1)
表格单元格不确定它自己的高度。而是UITableView布局单元格。现在,UITableView
确实有一个委托方法:- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
。但是,它会在表显示数据之前为表中的每一行调用该方法(或称为cellForRowAtIndexPath
委托方法)。这是因为UITableView
需要知道在开始显示数据之前表的大小(或高),因为它使用此信息来设置contentSize,确定滚动条高度等。这意味着,如果如果您希望表格单元格具有可变的单元格高度,则需要在表格加载之前计算这些单元格高度。如果表很小,那么这没有问题,但如果你的表很大或计算复杂,它可能会导致显示表的延迟。因此,您通常希望heightForRowAtIndexPath
非常有效。
但是一旦你完成了这个(计算了行高),除了布局子视图之外,你不需要在UITableViewCell
子类中做任何事情。已经为您设置了单元格高度。