我问这个(不知何故)简单的问题只是为了挑剔,因为有时我担心我可能会滥用许多 UIView 的 API,尤其是在自动布局方面。
为了让它变得超级简单,我将举一个例子,假设我需要一个 UIView 子类,它有一个图像图标和一个多行标签;我想要的行为是我的视图的高度随着标签的高度而变化(以适应里面的文本),另外,我正在使用界面生成器进行布局,所以我有这样的东西:
有一些约束给图像视图提供了固定的宽度和高度,并且给标签提供了固定的宽度和位置(相对于图像视图):
现在,如果我为标签设置一些文本,我希望调整视图的高度以正确适应它,或者保持与 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];
现在,考虑到约束,我知道自动布局系统调用intrinsicContentSize
视图树元素来了解它们的大小并进行计算,因此我应该intrinsicContentSize
在我的子视图中重写以返回它在前面显示的方法中返回的完全相同的东西sizeThatFits:
,除了事实上,以前,在调用时,sizeToFit
我已经正确调整了视图的大小,但现在使用自动布局,结合 xib,这不会发生。
当然,我可能会在sizeToFit
每次编辑子类中的文本时调用,以及intrinsicContentSize
返回完全相同大小的覆盖sizeThatFits:
,但不知何故,我认为这不是正确的做法。
我正在考虑覆盖needsUpdateConstraints
and updateConstraints
,但仍然没有多大意义,因为我的视图的宽度和高度是从 xib 的自动调整掩码推断和翻译的。
这么久了,您认为最干净、最正确的方法是什么,可以准确地制作我在这里展示的内容并支持完全自动布局?