Ios – UIView with dynamic height that uses intrinsicContentSize

autolayoutcocoa-touchiosobjective cuiview

I am trying to create a custom container view that has a UIImageView and a multiline UILabel as subviews. To make the view work nicely with autolayout, I am overriding intrinsicContentSize as below:

- (CGSize)intrinsicContentSize
{
    return [self sizeThatFits:self.bounds.size];
}

The size calculated in sizeThatFits has the same width, and adjusts the height so that the label and image are not clipped. This works well, but I was surprised to see in the docs the following comment:

This intrinsic size must be independent of the content frame, because there’s no way to dynamically communicate a changed width to the layout system based on a changed height, for example.

If that is the case, what is the autolayout way to adjust the views current height based on its width and content? Should I be approaching this in a different way?

Best Answer

To answer my own question, it appears that there is not an autolayout suitable solution to this situation. Looking to UILabel for inspiration, the problem here has been solved with the addition of a property preferredMaxLayoutWidth, which can then be used as a constraining width during the intrinsic content size calculation. Any custom view would need to use something similar.