why UITableViewAutomaticDimension not working? why UITableViewAutomaticDimension not working? ios ios

why UITableViewAutomaticDimension not working?


In order to make UITableViewAutomaticDimension work you have to set all left, right, bottom, and top constraints relative to cell container view. In your case you will need to add the missing bottom space to superview constraint for label under the title


I had added constraints programmatically, and accidentally added them to the cell directly, i.e. not on the contentView property. Adding the constraints to contentView resolved it for me!


To set automatic dimension for row height & estimated row height, ensure following steps to make, auto dimension effective for cell/row height layout.

  • Assign and implement tableview dataSource and delegate
  • Assign UITableViewAutomaticDimension to rowHeight & estimatedRowHeight
  • Implement delegate/dataSource methods (i.e. heightForRowAt and return a value UITableViewAutomaticDimension to it)

-

Objective C:

// in ViewController.h#import <UIKit/UIKit.h>@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>  @property IBOutlet UITableView * table;@end// in ViewController.m- (void)viewDidLoad {    [super viewDidLoad];    self.table.dataSource = self;    self.table.delegate = self;    self.table.rowHeight = UITableViewAutomaticDimension;    self.table.estimatedRowHeight = UITableViewAutomaticDimension;}-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {    return UITableViewAutomaticDimension;}

Swift:

@IBOutlet weak var table: UITableView!override func viewDidLoad() {    super.viewDidLoad()    // Don't forget to set dataSource and delegate for table    table.dataSource = self    table.delegate = self    // Set automatic dimensions for row height    // Swift 4.2 onwards    table.rowHeight = UITableView.automaticDimension    table.estimatedRowHeight = UITableView.automaticDimension    // Swift 4.1 and below    table.rowHeight = UITableViewAutomaticDimension    table.estimatedRowHeight = UITableViewAutomaticDimension}// UITableViewAutomaticDimension calculates height of label contents/textfunc tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {    // Swift 4.2 onwards    return UITableView.automaticDimension    // Swift 4.1 and below    return UITableViewAutomaticDimension}

For label instance in UITableviewCell

  • Set number of lines = 0 (& line break mode = truncate tail)
  • Set all constraints (top, bottom, right left) with respect to its superview/ cell container.
  • Optional: Set minimum height for label, if you want minimum vertical area covered by label, even if there is no data.

enter image description here

Note: If you've more than one labels (UIElements) with dynamic length, which should be adjusted according to its content size: Adjust 'Content Hugging and Compression Resistance Priority` for labels which you want to expand/compress with higher priority.