iphonedynamicuitableviewrow-height

UITableViewCell dynamic height with label


I have created a UITableViewCell with a NIB file. There is 1 label in it which is going to contain a tweet. So it needs to be a dynamic height. There also is a timeAgo label that has to fit underneath the tweet label.

I'm trying stuff with frames en sizes but I can't get the perfect solution.. I do this in the UITableViewCell file in the drawrect method.

self.tweet.lineBreakMode = UILineBreakModeWordWrap;
self.tweet.numberOfLines = 0;
self.tweet.font = [UIFont fontWithName:@"Arial" size:13.0f];
[self.tweet sizeToFit];  

CGFloat tweetHeight = self.tweet.frame.size.height;

self.timeAgo.lineBreakMode = UILineBreakModeWordWrap;
self.timeAgo.numberOfLines = 0;
self.timeAgo.font = [UIFont fontWithName:@"Arial" size:11.0f];
[self.timeAgo sizeToFit];

CGFloat timeAgoHeight = self.timeAgo.frame.size.height;

self.timeAgo.frame = CGRectMake(88, tweetHeight, 100, timeAgoHeight + 10.0f);

I have also tried a stringhelper which I found in a tutorial.

The:

- (CGFloat)RAD_textHeightForSystemFontOfSize:(CGFloat)size {

My HeightForRow methods is also already different because I use different cell styles. At the moment I return a hard value for each cell style but that also needs to change to the cellheight.


Solution

  • See this tutorial, http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/

    The trick is to make the label grow with the size of the cell, than you can just set the size of the cell and the cell will grow with it.

    Set the timeAgo label to align it self to the bottom of the cell.

    Set the numberOfLines of tweet to 0 via IB,re move all the draw code and only implement the following:

    - (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
        id item  = [self.item objectAtIndex:indexpath.row];
    
        CGFloat height = 85.0f;
    
        if ([item isKindOfClass:[Tweet class]]) {
            Tweet *tweet = (Tweet *)item;
            CGSize titleSize = [tweet.tweet sizeWithFont:[UIFont fontWithName:@"Arial" size:13.0f] constrainedToSize:CGSizeMake(260.0f, MAXFLOAT)];
    
            // adde the 24 pixels to get the height plus the time ago label.
            height =  titleSize.height + 24.0f;
    
        } else if( [item isKinfOfClass:[SC_Release class]]) {
            height = 65.0f;
        }
    
       return height;
    }