如何根据行内容制作可更改的表高度大小?

时间:2012-07-30 21:50:15

标签: iphone ios xcode

我希望行高基于内容高度...因此每个行的高度都根据内容调整大小。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return tableView.contentSize.height;
}

这是我到目前为止所做的,但它不起作用。

3 个答案:

答案 0 :(得分:1)

基本上,您需要获取单元格的内容,然后根据单元格的大小确定单元格的大小。例如,你可能有

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    NSString *string = cell.textLabel.text;
    CGSize textSize = [string sizeWithFont:[UIFont fontWithName:@"Helvetica" size:15] constrainedToSize:CGSizeMake(240, 5000)];
    return textSize.height + 40;
}    

以上操作是获取单元格中的文本,计算所需的高度(如果宽度为240px并使用Helvetica 15pt),然后相应地更改单元格的高度。您仍需要在cell.textLabel方法中调整cellForRowAtIndexPath的框架。

答案 1 :(得分:1)

Try this code for exmaple and also refer this http://www.icodeblog.com/2010/11/18/making-smarter-table-view-cells/  

 #define FONT_SIZE 14.0f
    #define CELL_CONTENT_WIDTH 125.0f
    #define CELL_CONTENT_MARGIN 10.0f
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
       // static NSString *CellIdentifier = @"Cell";
        NSString *CellIdentifier = [NSString stringWithFormat:@"%d", indexPath.row] ;
        UILabel *lblTitle = nil;
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;




            lblTitle =[[UILabel alloc]initWithFrame:CGRectMake(5, 15, 110, 44)];
            lblTitle.backgroundColor = [UIColor clearColor];
            lblTitle.textColor = [UIColor whiteColor];
            lblTitle.font = [UIFont systemFontOfSize:11.0];
            lblTitle.tag = 1;
            lblTitle.numberOfLines = 0;


            UILabel *lblType =[[UILabel alloc]initWithFrame:CGRectMake(125, 0, 75, 44)];
            lblType.backgroundColor = [UIColor clearColor];
            lblType.textColor = [UIColor whiteColor];
            lblType.font = [UIFont systemFontOfSize:11.0];
            lblType.tag = 2;

            UILabel *lblDate =[[UILabel alloc]initWithFrame:CGRectMake(200, 0, 60, 44)];
            lblDate.backgroundColor = [UIColor clearColor];
            lblDate.textColor = [UIColor whiteColor];
            lblDate.font = [UIFont systemFontOfSize:11.0];
            lblDate.tag = 3;

            UILabel *lblTime =[[UILabel alloc]initWithFrame:CGRectMake(265, 0, 50, 44)];
            lblTime.backgroundColor = [UIColor clearColor];
            lblTime.textColor = [UIColor whiteColor];
            lblTime.font = [UIFont systemFontOfSize:11.0];
            lblTime.tag = 4;

            [tableView beginUpdates];
            [tableView endUpdates]; 
            [cell.contentView addSubview:lblTitle];
            [cell.contentView addSubview:lblType];
            [cell.contentView addSubview:lblDate];
            [cell.contentView addSubview:lblTime];

        }

    //    lblTitle = (UILabel *) [cell.contentView viewWithTag:1];
    //    lblTitle.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"];
    //    NSString *strTitle =[NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];


    //    lblTitle.text = [NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];

        NSString *text = [NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];


        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap];

        if (!lblTitle)
            lblTitle = (UILabel*)[cell viewWithTag:1];

        [lblTitle setText:text];
        [lblTitle setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];


        UILabel *lblType = (UILabel *) [cell.contentView viewWithTag:2];
        lblType.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"type"];

        UILabel *lblDate = (UILabel *) [cell.contentView viewWithTag:3];
        lblDate.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"date"];

        UILabel *lblTime = (UILabel *) [cell.contentView viewWithTag:4];
        lblTime.text =[[itemsData objectAtIndex:indexPath.row] objectForKey:@"time"];

        return cell;
    }
    -(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *text = [NSString stringWithFormat:@"%@,%@,%@",[[itemsData objectAtIndex:indexPath.row] objectForKey:@"address"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"title"],[[itemsData objectAtIndex:indexPath.row] objectForKey:@"zipcode"]];

        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeCharacterWrap];

        CGFloat height = MAX(size.height, 44.0f);

        return height + (CELL_CONTENT_MARGIN * 2);
    }

答案 2 :(得分:0)

是的,因为调用此方法的时间,单元格的内容视图的框架是CGRectZero。您最好为单元格指定一个自定义属性并返回该属性。