Search code examples
iosobjective-cswiftuitableviewrow-height

UITableViewCell with dynamic height iOS


I have implemented TableView with CustomCell in my app,

I want dynamic height of my UITableViewCell according to text length in UITableViewCell,

here is the snapshot of Customcell

: and here is the snapshot of my UITableView : code snippet for heightForRowAtIndexPath

#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 320.0f
#define CELL_CONTENT_MARGIN 10.0f

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    NSString *text = [DescArr objectAtIndex:[indexPath row]];
    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
    CGFloat height = MAX(size.height, 100.0);
    return height; 
}

As you can see in the 2nd image, height for cell is fixed, it doesn't change with it's text (content) size.

Where am I making mistake? How can I make a a label or a cell to update its size according to its contents/text?


Solution

  • The following code worked fine for me.Try with this

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        CGFloat lRetval = 10;
        CGSize maximumLabelSize = CGSizeMake(231, FLT_MAX);
        CGSize expectedLabelSize;
    
    
        CGFloat numberoflines = [thirdcellText length]/17.0;
    
        if (indexPath.section == 0) {
            expectedLabelSize = [firstcellText sizeWithFont:[UIFont systemFontOfSize:16.0]
                                          constrainedToSize:maximumLabelSize
                                              lineBreakMode:NSLineBreakByWordWrapping];
            lRetval = expectedLabelSize.height;
        }
        else if(indexPath.section == 1)
        {
            expectedLabelSize = [secondcellText sizeWithFont:[UIFont systemFontOfSize:16.0]
                                           constrainedToSize:maximumLabelSize
                                               lineBreakMode:NSLineBreakByWordWrapping];
            lRetval = expectedLabelSize.height;
        }
        else if (indexPath.section == 2)
        {
            expectedLabelSize = [thirdcellText sizeWithFont:[UIFont systemFontOfSize:16.0]
                                           constrainedToSize:CGSizeMake(231, numberoflines*17.0)
                                               lineBreakMode:NSLineBreakByWordWrapping];
            lRetval = expectedLabelSize.height-128.0;
        }
    
        UIImage *factoryImage = [UIImage imageNamed:NSLocalizedString(@"barcode_factory_reset.png", @"")];
    
        CGFloat height = factoryImage.size.height;
    
        if (lRetval < height) {
            lRetval = height+15.0;
        }
    
        return lRetval;
    }
    

    Try to add the following code in your customcell class autolayout method

    textview.frame = frame;
    CGRect frame1 = textview.frame;
    frame1.size.height = textview.contentSize.height-2;
    textview.frame = frame1;
    
    
    textview.contentSize = CGSizeMake(textview.frame.size.width, textview.frame.size.height);
    
    labelPtr.frame = CGRectMake(CGRectGetMinX(imageView.frame)+CGRectGetMaxX(imageView.frame)+5.0, textview.frame.size.height+10.0, 140, 16.0);
    [labelPtr setNeedsDisplayInRect:labelPtr.frame];
    

    Try to set the label properties like the following

    labelPtr = [[UILabel alloc] initWithFrame:CGRectZero];
    labelPtr.backgroundColor =[UIColor clearColor];
    [labelPtr setNeedsLayout];
    [labelPtr setNeedsDisplay];
    [self.contentView addSubview:labelPtr];