Reputation: 18521
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
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
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
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