Search code examples
iosuitableviewios-autolayoutuitableviewautomaticdimension

UITableView with rowHeight UITableViewAutomaticDImension does not update when I change the number of lines


I have a UITableViewCell with a description label pinned to the bottom as shown below: enter image description here

Tapping on the description label toggles the numberOfLines between 3 and 0:

- (void)awakeFromNib {
    [super awakeFromNib];
    [self setupView];
}

-(void) setupView
{

    UITapGestureRecognizer * gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleNumberOfLines)];
    self.jobDescriptionLabel.userInteractionEnabled = YES;
    [self.jobDescriptionLabel addGestureRecognizer:gestureRecognizer];
}

- (void) toggleNumberOfLines {
    if(self.jobDescriptionLabel.numberOfLines != 0){
        self.jobDescriptionLabel.numberOfLines = 0;
    }else{
        self.jobDescriptionLabel.numberOfLines = kNumberOfLines;
    }
    [self.jobDescriptionLabel sizeToFit];
    [self layoutIfNeeded];
}

When I tap on the label, the number of lines does change but the cell does not expand to accommodate the new number of lines. How do I fix this?

Collapsed (Default):

enter image description here

Expanded:

enter image description here


Solution

  • If you have your constraints set up correctly, you do not need to reload the data --- not the whole table, not even the affected rows.

    Best method is to add a delegate function back to your tableview controller, and just call these lines back-to-back:

    tableView.beginUpdates()
    tablebleView.endUpdates()
    

    That will tell auto-layout to re-calc the row heights.

    Edit: Check my answer - which includes a link to a demo project - here: Expand UILabel inside UITableView with "more" button like Instagram