Reputation: 5510
I have a bit of a tricky set up in my storyboard, I have a UIViewController that holds a UITableViewController. Within the UITableViewController I have several prototypecells I have linked to subclassed uitableviewcell objects in code.
Using constraints and storyboard I would like to change the height of my prototype cell depending on the size the UILabel ends up being which is dependant on the text going into it.
Currently I have a
UIViewController
-- UITableViewController
-- -- UITableViewCell ((melchat) prototype cell)
-- -- -- ContentView
-- -- -- -- UIView ((background) view with drop shadow card type effect)
-- -- -- -- -- UIImageView (Avatar)
-- -- -- -- -- IUlabel (dynamic (depending on code/input) multi line UILabel)
Some how I would like the UILabel to resize the UIView (background) then in turn effect the height of that UITableViewCell.
I am using XCode 8.2.1
I have taken a screen shot of the layout in storyboard and constraints applied.
I have updated my constraints to pretty much all go back to ContentView and have updated uilabel line count to 0 and then also implemented the UITableViewAutomaticDimension code but its still not working. Please see code and screen shots below.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
Upvotes: 16
Views: 37643
Reputation: 10329
Swift 4.2 and 5. As mention above you can set UITableView object property or
tblView.rowHeight = UITableView.automaticDimension
tblView.estimatedRowHeight = 300
you can also define the same by implementing UITableViewDelegate methods
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 300
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
}
Upvotes: 7
Reputation: 3383
step1:Give below constraint to UIView that is inside to the contentView.
step2: Give below constraint to UIlabel
step3: Then select your Trailing constraint of IUlabel and select edit option and then select constant and select greaterThanEqual option.
step4: set label's numberofline = 0
step5: Add this code into viewDidLoad()
yourtableview.estimatedRowHeight = 80.0
yourtableview.rowHeight = UITableViewAutomaticDimension
Upvotes: 10
Reputation: 19758
To go a little further on Dao's answer..
He is correct, you need to use UITableViewAutomaticDimension
Also, you need to ensure that you setup your constraints in a way that all of the content in the cell is constrained to the cells contentView. So your label will likely need constraints such as
Make sure that you set the UILabel to multiline (or lines = 0) and it should work.
If you are using the heightForRowAt delegate functions ensure you return UITableViewAutomaticDimension
Upvotes: 30
Reputation: 652
After populating the UILabel and applying constrains, get the height of the label and set it as the height of the UIView.
After that call -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
and pass the height of the UILabel/UIView so that it gets the actual height for that row
Upvotes: -1
Reputation: 2930
Use UITableViewAutomaticDimension
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300
Upvotes: 13