I'm asking this (somehow) simple question just to be finicky, because sometimes I'm worried about a misuse I might be doing of many UIView's APIs, especially when it comes to autolayout.
To make it super simple I'll go with an example, let's assume I need an UIView subclass that has an image icon and a multiline label; the behaviour I want is that the height of my view changes with the height of the label (to fit the text inside), also, I'm laying it out with Interface builder, so I have something like this:
with some constraints that give fixed width and height to the image view, and fixed width and position (relative to the image view) to the label:
Now, if I set some text to the label, I want the view to be resized in height to fit it properly, or remain with the same height it has in the xib. Before autolayout I would have done always something like this:
In the CustoView subclass file I would have overridden sizeThatFits:
like so:
- (CGSize) sizeThatFits:(CGSize)size{
//this stands for whichever method I would have used
//to calculate the height needed to display the text based on the font
CGSize labelSize = [self.titleLabel intrinsicContentSize];
//check if we're bigger than what's in ib, otherwise resize
CGFloat newHeight = (labelSize.height <= 21) ? 51: labelSize.height+20;
size.height = newHeight;
return size;
}
And than I would have called something like:
myView.titleLabel.text = @"a big text to display that should be more than a line";
[myView sizeToFit];
Now, thinking in constraints, I know that autolayout systems calls intrinsicContentSize
on the view tree elements to know what their size is and make its calculations, therefore I should override intrinsicContentSize
in my subview to return the exact same things it returns in the sizeThatFits:
method previously shown, except for the fact that, previously, when calling sizeToFit
I had my view properly resized, but now with autolayout, in combination with a xib, this is not going to happen.
Of course I might be calling sizeToFit
every time I edit text in my subclass, along with an overridden intrinsicContentSize
that returns the exact same size of sizeThatFits:
, but somehow I don't think this is the proper way of doing it.
I was thinking about overriding needsUpdateConstraints
and updateConstraints
, but still makes not much sense since my view's width and height are inferred and translated from autoresizing mask from the xib.
So long, what do you think is the cleanest and most correct way to make exactly what I show here and support fully autolayout?
systemLayoutSizeFittingSize:…
methods, thanks. Are there particular issues withUILabel
's preferredMaxLayoutWidth? It can just be made automatic and it'll expand to fit (other constraints), no? – Cowberry