Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITableViewCell auto height based on amount of UILabel text

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.

enter image description here

Update

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;

}

enter image description here

enter image description here

like image 354
HurkNburkS Avatar asked Mar 10 '17 11:03

HurkNburkS


4 Answers

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

  • Leading constraint to ImageView
  • Top constraint to contentView
  • Bottom constraint to contentView
  • Trailing constraint to contentView

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

like image 84
Scriptable Avatar answered Nov 15 '22 12:11

Scriptable


Use UITableViewAutomaticDimension

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300
like image 32
Đào Minh Hạt Avatar answered Nov 15 '22 12:11

Đào Minh Hạt


step1:Give below constraint to UIView that is inside to the contentView.

  • Leading constraint to contentView
  • Top constraint to contentView
  • Bottom constraint to contentView
  • Trailing constraint to contentView

step2: Give below constraint to UIlabel

  • Leading constraint to UIImageView
  • Top constraint to UIView
  • Bottom constraint to UIView
  • Trailing constraint to UIView

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
like image 9
Brijesh Shiroya Avatar answered Nov 15 '22 13:11

Brijesh Shiroya


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
      }
    }
like image 7
Gurjinder Singh Avatar answered Nov 15 '22 12:11

Gurjinder Singh