Arian Faurtosh
Arian Faurtosh

Reputation: 18521

How to make a changeable table height size based off of row content?

I want the row height to be based off the content height... so each row height is sized to fit based off the content.

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

This is what i have so far but it doesn't work.

Upvotes: 0

Views: 258

Answers (3)

iAndroid
iAndroid

Reputation: 951

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);
    }

Upvotes: 1

danqing
danqing

Reputation: 3668

Basically you need to get the content of the cell and then base the size of your cell on it. For example, you may have

- (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;
}    

What the above does is it gets the text in your cell, calculate the height it needs (if it's 240px wide and uses Helvetica 15pt), and then change the height of your cell accordingly. You still need to adjust the frame of your cell.textLabel in your cellForRowAtIndexPath method.

Upvotes: 1

user529758
user529758

Reputation:

yes, becauss the time this method is called, the cell's content view's frame is CGRectZero. You better assign a custom property to the cell and return that.

Upvotes: 0

Related Questions