如何获取UITableViewCell的contentView宽度?

时间:2012-01-11 12:48:44

标签: objective-c ios uitableview

我需要自定义单元格中的 UITableViewStyleGrouped table.It必须看起来UITableViewCellStyleValue1如果为textLabel和detailTextLabel都表明无截短,或作为UITableViewCellStyleSubtitle(但detailTextLabel宽度= contentView.frame.size.width和UITextAlignmentRight)如果在Value1样式中,其中一个标签被截断。

我需要知道方法- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath中cell.contentView的宽度,以确定单元格的高度。我比较了cell.contentView.width和标签宽度之和(我用方法sizeThatFits:得到它们)来决定它。

那么,如何在创建单元格之前获得正确的cell.contentView.frame.size.width?

UPD:一些代码来澄清问题。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    CGFloat cellHeight = 44;

    CGSize textSize = [[arrayOfTextData objectAtIndex:indexPath.row] 
                           sizeWithFont:[UIFont systemFontOfSize:14]
                           constrainedToSize:CGSizeMake( 1000, 100)
                           lineBreakMode:UILineBreakModeCharacterWrap];
    CGSize detailedTextSize = [[arrayOfDetailTextData objectAtIndex:indexPath.row] 
                                    sizeWithFont:[UIFont systemFontOfSize:14]
                                    constrainedToSize:CGSizeMake(1000, 100) 
                                    lineBreakMode:UILineBreakModeCharacterWrap];
    if (textSize.width + detailedTextSize.width > /* I need here cell.contentView.frame.size.width*/  300) {
         cellHeight = textSize.height + detailedTextSize.height;
    }
    return cellHeight;
}

UPD2:问题是,当我创建cell时,cell.contentView.frame.size.width等于cell.frame.size.width并等于320,但是在cell出现cell.contentView之后。 frame.size.width依赖于tableView宽度和tableView样式而改变。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"tmpCell";
    CustomTableViewCellValue1OrSubtitle *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[CustomTableViewCellValue1OrSubtitle alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];     
    } 
    //--Configure the cell
        cell.textLabel.text = [arrayOfTextData objectAtIndex:indexPath];
        cell.detailTextLabel.text = [arrayOfDetailTextData objectAtIndex:indexPath.row];

    [cell layoutIfNeeded];

    CGSize textSize = [cell.textLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.contentView.bounds.size.width, 99999) lineBreakMode:cell.textLabel.lineBreakMode];
    CGSize detailedTextSize = [cell.detailTextLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.contentView.bounds.size.width, 99999) lineBreakMode:cell.textLabel.lineBreakMode];
    CGFloat cellHeight = cell.contentView.frame.size.height;

    NSLog(@"contentView.frame.size.width = %f",cell.contentView.frame.size.width);
    //out: contentView.frame.size.width = 320.0
    //Always print 320, even if I set Simulator on iPad

    if (textSize.width + detailedTextSize.width > cell.contentView.frame.size.width) {
        cellHeight = textSize.height + detailedTextSize.height;
    }
    return cellHeight;
}

3 个答案:

答案 0 :(得分:4)

如果我没弄错,则在初始化单元格之前或之后调用heightForRowAtIndexPath:,因此没有时间调整大小。

这应该适合你:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%f", cell.contentView.frame.size.width);
}

不幸的是,这是在heightForRowAtIndexPath之后调用的。我发现基于非常量宽度调整高度的唯一方法是在第一次调用此方法时为width设置一个实例变量,然后重新加载表视图并在heightForRowAtIndexPath中使用width实例变量。 / p>

答案 1 :(得分:0)

创建单元格时未设置contentView UITableViewStyleGrouped中单元格的UITableView宽度,因此您可以为标签设置autoresizingMask,如下所示:

label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;

对我而言,它正在发挥作用。

答案 2 :(得分:-2)

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

     if (indexPath.section == 0) 
         return 60.0f;
    else
        return 50.0f;

}

通过应用此功能,您可以设置单元格 - >内容查看。如果您需要动态单元格宽度,请使用上述方法中的标志