使用autolayout动态更改子视图后调整superview的大小

Ped*_*ace 83 objective-c uiview autoresize ios autolayout

这个调整大小的超级视图的悬念我不能满足上帝的爱.

我有一个UIView *superview 4 UILabels.2用作另外2个的标题.

所有4个内容都来自数据库.

SizeToFitvs SizeThatFits:(CGSize)vs UIView systemLayoutSizeFittingSize:,传球UILayoutFittingCompressedSize或者UILayoutFittingExpandedSize.

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

我在哪里以及如何使用这些SizeToFitvs sizeThatFits:(CGSize)vs UIView systemLayoutSizeFittingSize:,传递UILayoutFittingCompressedSize或者UILayoutFittingExpandedSize.我已经在堆栈上阅读了很多提示但最终没有任何结果.

我是否需要在某处特定的情况下重新计算superview的约束.Maby在其控制器类中将高度设置为'@ property`并删除并读取它?Atm我试图将所有东西都放在一起然后放一些.我仍然得到相同大小的最终结果,虚拟高度和文字漂浮在外面.甚至在子视图上设置clipsToBound之后.

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

smi*_*org 103

如果您正在使用自动布局,请执行以下操作:

  1. 确保您没有为任何子视图添加固定宽度和/或高度约束(取决于您想要动态调整的尺寸).我们的想法是让每个子视图的内在内容大小决定子视图的高度.UILabels带有4个自动隐式约束,它们(小于所需优先级)尝试将标签的框架保持在适合所有文本所需的确切大小.

  2. 确保每个标签的边缘严格连接(具有必需的优先级约束)到彼此的边缘及其超视图.你想确保如果你想象其中一个标签的大小增加,这将迫使其他标签为它腾出空间,最重要的是迫使superview扩展.

  3. 仅向超级视图添加约束以设置其位置,而不是大小(至少不是您希望它动态调整大小的尺寸).请记住,如果正确设置内部约束,其大小将由所有子视图的大小决定,因为它的边缘以某种方式连接到它们的边缘.

而已.您不需要调用sizeToFitsystemLayoutSizeFittingSize:使其工作,只需加载您的视图并设置文本即可.系统布局引擎将为您进行计算以解决您的约束.(如果有的话,你可能需要调用setNeedsLayoutsuperview ......但这不是必需的.)


Cam*_*mer 24

使用容器视图

在下面的示例中,我有一个30x30的图像,并且UILabel小于包含占位符文本的包含视图.我需要包含视图至少与图像一样大,但它需要增长以包含多行文本.

在可视格式中,内部容器如下所示:

H:|-(15.0)-[image(30.0)]-(15.0)-[label]-(15.0)-|
V:|[image(30.0)]|
V:|[label(>=30.0)]|
Run Code Online (Sandbox Code Playgroud)

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

正如@smileyborg在他的回答中指出的那样,将内容严格地连接到superview通知布局引擎简单的容器视图应该使其增长.

黄色对齐矩形

如果您希望黄色对齐矩形添加-UIViewShowAlignmentRects YES到您的方案的运行参数列表中.

UILabel是多线的

  • `-UIViewShowAlignmentRects YES` - 很棒的提示! (12认同)
  • 在这种情况下,容器只需要使其高度适应标签.如果容器应该适应多个视图的高度之和怎么办? (2认同)

Jac*_*uth 6

通过在iOS 9中引入堆栈视图,大大简化了此操作。在视图内部使用堆栈视图来包含所有调整大小的内容,然后只需调用

view.setNeedsUpdateConstraints()
view.updateConstraintsIfNeeded()
view.setNeedsLayout()
view.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

更改内容后。然后,您可以通过致电获得新的尺寸

view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
Run Code Online (Sandbox Code Playgroud)

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

  • 我正在使用StackView并动态添加视图,这些视图的大小没有调整。@ JacobRuth (2认同)

tes*_*sla 5

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

在此处输入图片说明

虽然不会描述所有约束,但是会描述与UI对象的高度计算有关的约束。

  1. [标签]标签必须没有固定的height约束,在这种情况下,AutoLayout不会调整标签的大小以适合文本,因此设置边缘约束是关键。(绿色箭头)
  2. [Subview]步骤1和3非常容易执行,但是此步骤可能会被误解。与使用标签的情况一样,子视图不得height设置约束。所有子视图都必须top设置bottom约束,而忽略约束,这可能使您认为将在运行时触发未满足的约束异常,但是如果您bottom为最后一个子视图设置约束则不会。缺少这样做会打击布局。(红色箭头)

  3. [Superview]根据需要设置所有约束,但要特别注意 height约束。给它分配一个随机值,但将其设置为可选值,则AutoLayout会自动设置高度以适合子视图。(蓝色箭头)

这可以完美地工作,无需调用任何其他系统布局更新方法。