brokedid
brokedid

Reputation: 899

iOS dynamical height of UITableViewCell and heightForRowAtIndexPath

I'm using Autolayout for my new UITableViewCells in a large project.

I've one TableView where the height of each row is calculated automatically, there I don't use the delegate function heightForRowAtIndexPath.

I've declared a estimated row height:

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

My question is: on another TableViewController there are a lot of UITableViewCells, where I programmatically need to declare the height of the cell in heightForRowAtIndexPath. I know that It would be better to convert all cell's to use a unique solution, but in this project are a lot of different cell's, so I'd like to use a workaround and combine the dynamically calculated height with autolayout and the programmatically calculated row height.

Is this possible?

Upvotes: 9

Views: 17053

Answers (3)

Hindu
Hindu

Reputation: 2914

If you are using iOS 8 and above, you do not need to calculate height dynamically. Auto layout will do all for you. But if you are using lower than IOS 8, you need to calculate cell height.

For IOS 8:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewAutomaticDimension;
}

And add below code in your controller:

tableView.estimatedRowHeight = 400.0
tableView.rowHeight = UITableViewAutomaticDimension

Where estimatedRowHeight should be max height which can be for your cell.

Thanks

Upvotes: 24

Developer
Developer

Reputation: 287

You can try this.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
     int topPadding = cell.yourLabel.frame.origin.x;
     int bottomPadding = cell.frame.size.heigth-(topPadding+cell.yourLabel.frame.size.height);
     NSString *text = [DescArr objectAtIndex:[indexPath row]];
     CGSize maximumSize = CGSizeMake(cell.yourLabel.frame.size.width, 9999);
     CGSize expectedSize = [text sizeWithFont:yourCell.yourLabel.font constrainedToSize:maximumSize lineBreakMode:yourCell.yourLabel.lineBreakMode];

     return topPadding+expectedSize.height+bottomPadding;
}

Upvotes: 0

Sreejith
Sreejith

Reputation: 1355

Calculate the height of the content dynamically using boundingRectWithSize. If you have a UILabel which is dynamic, you can use the following :

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

   /* Check Content Size and Set Height */
    CGRect answerFrame = [YOUR_LABEL.text boundingRectWithSize:CGSizeMake(240.f, CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:[UIFont fontWithName:@"" size:14.0f]} context:nil];

    CGSize requiredSize = answerFrame.size;

    return requiredSize.height;
}

Upvotes: 0

Related Questions