I have a 'master' UITableView, in which I use different cells that are loaded from .xib's. Some of these cells themselves also have a UITableView.
For now I have set the row height of each cell to the original xib size. However, I would like to have the height dynamic and corresponding to the amount of rows in the 'child' UITableView.
I run into the following problem:
I have tried the following:
However, in this case, the cell will use the 'estimated' height to lay out its own rows. Therefore it is always too big or too small.
How do I solve this problem?
First Approach:
Create a subclass for child tableView and override intrinsicContentSize.
class MyOwnTableView: UITableView {
override var intrinsicContentSize: CGSize {
self.layoutIfNeeded()
return self.contentSize
}
override var contentSize: CGSize {
didSet{
self.invalidateIntrinsicContentSize()
}
}
override func reloadData() {
super.reloadData()
self.invalidateIntrinsicContentSize()
}
}
In Interface builder change the class of your child tableView to MyOwnTableView (subclass UITableView).
Set automatic row height for both the parent and child table view.
tableView.estimatedRowHeight = 60.0;
tableView.rowHeight = UITableViewAutomaticDimension;
Second Approach: 1. Create a height constraint with any value for child tableView and conect an IBOutlet that sets the child tableView height. 2. Set the height constraint's constant to tableView.contentSize.height
self.tableViewHeight.constant = self.tableView.contentSize.height
You could create the object which will create template object of class you want to put in cell, put data in it, calculate its size and return it on sizeForItem method of master tableView. That way you will be able to set returned calculated size for item when master tableView is preparing data.
This is the way i do it in my projects.
You could improve this object with cache, make it generic and use everywhere you may need to.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With