我问这个(不知何故)简单的问题只是为了挑剔,因为有时我担心自己可能会误用许多UIView的API,尤其是在自动布局方面.
为了让它变得超级简单,我将举一个例子,假设我需要一个UIView子类,它有一个图像图标和一个多行标签;我想要的行为是,我的视图的高度会随着标签的高度而变化(以适应里面的文本),而且,我正在使用Interface builder进行布局,所以我有如下内容:
通过一些约束,可以为图像视图提供固定的宽度和高度,并为标签提供固定的宽度和位置(相对于图像视图):
现在,如果我给标签设置了一些文本,我希望视图的高度可以调整,以适合它,或者保持与xib中的高度相同.
在CustoView子类文件中,我会像这样覆盖sizeThatFits:
:
- (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;
}
然后我会称之为:
myView.titleLabel.text = @"a big text to display that should be more than a line";
[myView sizeToFit];
现在,在约束中思考,我知道autolayout系统调用视图树元素上的intrinsicContentSize
,以了解它们的大小并进行计算,因此我应该在子视图中重写intrinsicContentSize
,以返回与之前显示的sizeThatFits:
方法中返回的完全相同的内容,除了以下事实:,当我打sizeToFit
时,我的视图被适当地调整了大小,但现在有了autolayout,再加上一个xib,这是不会发生的.
当然,每次编辑子类中的文本时,我可能都会调用sizeToFit
,以及返回与sizeThatFits:
大小完全相同的重写intrinsicContentSize
,但不知何故,我认为这不是正确的方法.
我曾考虑覆盖needsUpdateConstraints
和updateConstraints
,但仍然没有太多意义,因为我的视图的宽度和高度是从xib的自动调整大小掩码推断和转换而来的.
那么,你认为什么是最干净、最正确的方法来制作我在这里展示的内容,并支持完全自动布局?