denislexic
denislexic

Reputation: 11392

Dynamic table view cell, change of subview height programmatically

I have a UITableViewCell with a custom view cell. In this view cell, I have a simple UIView called imgWrapper where I added constraints as follows:

Those are the only constraints in there. And I left the hugging and compression to the default ones.

In my code I've set this:

  override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.estimatedRowHeight = 90
}

Then in in my rowAtIndex...I have this:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: LogCustomCell = tableView.dequeueReusableCellWithIdentifier("logCustomCell", forIndexPath: indexPath) as! LogCustomCell

     var imgWrapperHeight: CGFloat = log.big ? 100 : 50

     cell.imgWrapperHeight.frame.size.height = imgWrapperHeight 
     return cell
}

Once I compile and run it. All the cells are the same size.

Notes:

enter image description here

Any ideas what I'm doing wrong?

Upvotes: 0

Views: 5583

Answers (4)

pram
pram

Reputation: 11

add

self.automaticallyAdjustsScrollViewInsets = false

before these two lines

tableView.estimatedRowHeight = 50
tableView.cellHeight = UITableViewCellAutomaticDimension

Upvotes: 1

denislexic
denislexic

Reputation: 11392

Solutions 1:

As mentioned by the users. You can set the row height in your UITableViewController like so:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return (true ? 100 : 50) + 2 * 20
}

Solution 2:

Set the height constraint on the element that will determine the height of cell. Then create an outlet in your VC for NSLayoutConstraint While you are setting the content of the cell, you can do:

Ex: @IBOutlet var imgWrapperHeightConstraint: NSLayoutConstraint!

...

override func tableView(tableView: UITableView, cellAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    imgWrapperHeightConstraint.constant = 50 // Or whatever value you want
}

Upvotes: 0

Ali Jawad
Ali Jawad

Reputation: 151

Delegate method "heightForRowAtIndexPath" will do it for you. You can know cell index for which you are returning height from indexPath.row and hence return height accordingly.

i.e

if indexPath.row == 0
{
  return 70
}
else if indexPath.row == 1
{
  return 100
}

Upvotes: 1

Kumuluzz
Kumuluzz

Reputation: 2012

You need to put your height logic into the UITableViewDelegate method called tableView:heightForRowAtIndexPath, something like the following:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return (true ? 100 : 50) + 2 * 20
}

PS. I've written this in Swift 2, thus the overridekeyword.

Upvotes: 2

Related Questions