UITableViewCell - layoutSubview,具有适应文本的视图高度

时间:2013-03-13 13:24:44

标签: iphone objective-c uitableview

当我创建自己的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];
}

2 个答案:

答案 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子类中做任何事情。已经为您设置了单元格高度。