Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamic height for UITableView ( Not Cell )

I'm trying to have a UITableView that lists all the different HomeKit devices a user has available.

Obviously there is no way to know how many devices they have, so I need to have the UITableView's height in the storyboard change.

I've tried this, which I call in the viewDidLoad() function:

func adjustHeightOfTableView() {

  //getting the height of the tableview
    var tableHeight = self.tableView.contentSize.height

   //the height of the content inside the view
    var maxHeight = self.tableView.superview?.frame.size.height


    //if the height of the content is bigger then the height of the tableview
    if (maxHeight! > tableHeight) {

        tableHeight = maxHeight!
        //set the tableview height to be the content height

    }

    //trying to reload the tableview height?
    self.view.layoutIfNeeded()
    self.tableView.reloadData()

}

I am trying to have some UI Elements under the tableview, and I want them to be a set space from the bottom of the tableview, but also have the tableview be the height that it needs to be, for whatever amount of cells there is.

But it's just not working. If I'm doing anything wrong, or if anyone knows how to make this work, please let me know. Thanks!

like image 924
Jolaroux Avatar asked Feb 23 '26 08:02

Jolaroux


2 Answers

Note: For this approach you need to have static cell height or figure out a way to know before hand whats the total contentsize height

Assuming you are using constraints, create following constraints on your UITableView (apart from leading and trailing!)

Add a height constraint with a priority of 750 and a bottom spacing constraint of 0 to your super view that will be >= 0 and have a priority of 1000. Create outlet for this height constraint that you created in your UIViewController

Now,

func adjustHeightOfTableView() {

  //set the height to be equal to the number of elements multiplied by the height of each cell. 
 //or use some logic that allows you to know what content size or space the cells will occupy!
  tableViewHeightConstraint.constant = dataArray.count * rowHeight    

  view.layoutIfNeeded()
}

Now if your UITableView height is less than super view, no problems! But if it is greater than screen bounds, it will break the height constraint and become full screen and display the content normally as you expect a UITableView to!

Edit: Even if you are using UIAutomaticRowDimensions what you can do is add constraints programmatically to your UITableView. i.e

Of course all your other views will still have a bottom constraint to your UITableView. Create a UITableView in your storyboard with normal leading, trailing, top and bottom to the super view. Fetch the data. Get the contentSize for your UITableView and then remove the bottom constraint. Now add a height constraint that will be the minimum value of your UIScreen.main().bounds.size.height and contentSize.

like image 166
Rikh Avatar answered Feb 24 '26 20:02

Rikh


you can use Automatic Dimensions if you are using autolayouts

in view didload:

let nib = UINib(nibName: "YOURCELLNIB", bundle: nil)
      tableView.registerNib(nib, forCellReuseIdentifier: "REUSEIDENTIFIER")
      tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 140

Remove the function

 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath)
like image 42
amar Avatar answered Feb 24 '26 21:02

amar