在子视图使用自动布局dynamic更改后调整superview的大小

我不能因为这个重新调整的超级观点的结局而爱上帝。

我有一个UIView *superview 4 UILabels 。 2作为其他2个头的function。

所有4个内容都是来自数据库的dynamic。

SizeToFit vs SizeThatFits:(CGSize) vs UIView systemLayoutSizeFittingSize:传递UILayoutFittingCompressedSizeUILayoutFittingExpandedSize

我以编程方式使用autolayout,并将superview高度设置为等于或大于虚拟数字。

在哪里以及如何使用这些SizeToFit vs sizeThatFits:(CGSize) vs UIView systemLayoutSizeFittingSize:传递UILayoutFittingCompressedSizeUILayoutFittingExpandedSize 。 我在这里阅读了很多技巧,但没有结果。

我是否需要重新计算特定于某处的超级视图的约束条件。 Maby在其控制器类中将高度设置为“@属性”并删除并读取它? 自动取款机我试图把所有的东西,然后一些。 仍然我得到相同大小的最终结果与虚拟高度和文字浮动外面。 即使在subview上设置clipsToBound之后。

我正在抓我的头发..帮助

如果您使用的是自动布局,那么您需要执行以下操作:

  1. 确保您没有为任何子视图添加固定的宽度和/或高度约束(取决于您要dynamicresize的维度)。 这个想法是让每个子视图的内在内容大小决定子视图的高度。 UILabel s带有4个自动隐式约束,它们将会(小于所需的优先级)尝试将标签的框架保持在所需的精确大小以适应所有文本。

  2. 确保每个标签的边缘都严格地连接到彼此的边缘和它们的超级视图。 你要确保如果你想象其中一个标签越来越大,这将迫使其他标签腾出空间,最重要的是强制superview扩展。

  3. 只给superview添加约束来设置它的位置,而不是size(至less,不是你想要dynamic调整的尺寸)。 请记住,如果你正确设置内部约束,其大小将由所有子视图的大小决定,因为它的边以某种方式连接到它们的边。

而已。 你不需要调用sizeToFitsystemLayoutSizeFittingSize:为了得到这个工作,只需加载你的意见,并设置文本,应该是它。 系统布局引擎将为您解决您的约束做计算。 (如果有的话,你可能需要在setNeedsLayout上调用setNeedsLayout …但是这不是必需的。)

使用容器视图

在下面的例子中,我有一个30×30的图像,并且UILabel小于包含占位符文本的视图。 我需要包含的视图至less与图像一样大,但是它需要包含多行文本。

在视觉格式中,内部容器看起来像这样:

 H:|-(15.0)-[image(30.0)]-(15.0)-[label]-(15.0)-| V:|[image(30.0)]| V:|[label(>=30.0)]| 

然后,设置包含视图以匹配标签的高度。 现在,包含的视图将与标签的大小相符。

正如@smileyborg在他的回答中指出的,将内容严格地连接到超级视图通知布局引擎,简单的容器视图应该导致它增长。

黄色alignment矩形

如果您想要黄色alignment矩形,请在您的scheme的运行参数列表中添加-UIViewShowAlignmentRects YES

UILabel即多线

通过在iOS 9中引入堆栈视图,这变得非常容易。在视图中使用堆栈视图来包含resize的所有内容,然后只需调用

 view.setNeedsUpdateConstraints() view.updateConstraintsIfNeeded() view.setNeedsLayout() view.layoutIfNeeded() 

改变你的内容后。 那么你可以通过打电话来获得新的尺寸

 view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 

如果您需要计算视图所需的确切大小。

这几乎跟@smileyborg的答案,并带有一个具体的例子。

在这里输入图像说明

不会描述所有约束条件,而是与UI对象的高度计算有关。

  1. [标签]标签不能有固定的height限制,在这种情况下,AutoLayout不会调整标签的大小以适应文本,所以设置边缘限制是关键。 (绿色箭头)
  2. [子视图]步骤1和3非常容易遵循,但这一步可能会被误解。 和标签一样,子视图不能设置height约束。 所有子视图必须有top约束集,忽略bottom约束,这可以让你认为会在运行时触发不满足的约束exception,但是如果你为最后一个子视图设置bottom约束,那么不会。 缺less这样做会打击布局。 (红色箭头)

  3. [Superview]根据需要设置所有约束,但要注意height限制。 为它指定一个随机值,但使其成为可选项,AutoLayout将精确设置高度以适应子视图。 (蓝色箭头)

这完美的工作,没有必要调用任何额外的系统布局更新方法。