Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITableViewCell's contentView gets unwanted "height==44" constraint

I'm creating my UI entirely in code and using Masonry to constrain the cell's content view's subviews to the appropriate height. I'm using

[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height

on iOS 7 for the row height, while iOS 8 handles it automatically.

Everything looks exactly as it should on screen, but in the console I get trainloads of warnings for conflicting constraints, which all seem to be caused by an unasked and unnecessary height constraint on the cell's content view (e.g. <NSLayoutConstraint UITableViewCellContentView.height == 44>).

On iOS 8 I'm setting the table view's rowHeight as UITableViewAutomaticDimension (effectively -1) but still I get this constraint. I'm only adding constraints between the content view and its own subviews, so no constraints between the content view and the cell itself.

Any idea where this constraint comes from and how to make it go away?

Edit: Now I actually found a "solution" of sorts – initially setting the content view's frame to something ridiculous, like CGRectMake(0, 0, 99999, 99999), before adding subviews or constraints, seems to make the warnings go away. But this doesn't exactly smell like the right way to do it, so can anyone tell of a better approach?

like image 235
villapossu Avatar asked Sep 29 '14 12:09

villapossu


3 Answers

I had the same issue and fixed it setting the auto resizing mask of the cell like this:

override func awakeFromNib() {
    super.awakeFromNib()
    self.contentView.autoresizingMask = .flexibleHeight
}

Also in the controller I set the estimated height and tell the table view to use automatic dimension (in the viewDidLoad method:

    self.tableView.estimatedRowHeight = 120
    self.tableView.rowHeight = UITableView.automaticDimension

These links helped:

http://useyourloaf.com/blog/2014/08/07/self-sizing-table-view-cells.html

Auto layout constraints issue on iOS7 in UITableViewCell

Hope this helps!

like image 191
Maricel Avatar answered Oct 15 '22 21:10

Maricel


To tack on to the accept answer- after months of trying to get iOS 8's automatic cell sizing to work I discovered an important caveat. The 'estimatedRowHeight' property MUST be set. Either via the tableView directly or by implementing the delegate methods. Even if there's no way to determine a valid estimate, simply providing a value other than the default (0.0) has demonstrably allowed iOS 8's cell layout to work in my testing.

like image 20
Sean G Avatar answered Oct 15 '22 21:10

Sean G


Regarding to the "solution" mentioned in the edit in the question (setting the contentView frame to something big temporarily), here's proof this is a good "solution": https://github.com/smileyborg/TableViewCellWithAutoLayoutiOS8/blob/master/TableViewCellWithAutoLayout/TableViewController/TableViewCell.swift

        // Note: if the constraints you add below require a larger cell size than the current size (which is likely to be the default size {320, 44}), you'll get an exception.
        // As a fix, you can temporarily increase the size of the cell's contentView so that this does not occur using code similar to the line below.
        //      See here for further discussion: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188
        // contentView.bounds = CGRect(x: 0.0, y: 0.0, width: 99999.0, height: 99999.0)

It's hacky but it seems to work.

like image 41
Liron Yahdav Avatar answered Oct 15 '22 23:10

Liron Yahdav